GCD和本地UI刷新问题

时间:2011-07-19 02:46:46

标签: iphone grand-central-dispatch

我收到了这段代码

-(void)changeText
{

  dispatch_queue_t gqueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);

  dispatch_async(gqueue, ^(void){
    //simulate a network traffic delay
    [NSThread sleepForTimeInterval:5];
    NSLog(@"start executing");
    self.mylabel.text = @"Yeah! Text Changed";
    NSLog(@"stop exec");
  });
}

问题是,更改标签文本需要花费太多时间。如果我使用主队列,它会立即执行,但UI将被阻止5秒钟。

使用GCD的正确方法是什么,以便我可以在另一个帖子中下载内容,我的UI不会被阻止,一旦我的工作完成,我的UI会立即改变?

1 个答案:

答案 0 :(得分:5)

您无法在后台线程上修改UIKit对象(例如UILabel)。以上应该是:

-(void)changeText
{

  dispatch_queue_t gqueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);

  dispatch_async(gqueue, ^(void){
    //simulate a network traffic delay
    [NSThread sleepForTimeInterval:5];
    NSLog(@"start executing");
    dispatch_async(dispatch_get_main_queue(), ^{
      self.mylabel.text = @"Yeah! Text Changed"; });
    NSLog(@"stop exec");
  });
}

您也可以使用dispatch_sync而不是display_async等待主线程处理更改,但要注意死锁。