在主线程上调用dispatch_sync(dispatch_get_global_queue())会导致应用程序“挂起”吗?

时间:2012-01-09 02:22:55

标签: objective-c ios xcode objective-c-blocks grand-central-dispatch

// Method called when a button is clicked

- (void)handleClickEvent {
      dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
         [self backgroundProcessing];
      });
      // Some code to update the UI of the view
      ....
      [self updateUI];
      ....
}

1)当按下视图上的按钮时,在主线程上调用handleClickEvent。

2)我使用了dispatch_sync(),因为在计算backgroundProcessing方法中的变量之前,无法完成以下更新视图UI的代码。

3)我使用dispatch_get_global_queue以使backgroundProcessing脱离主线程。 (遵循规则:通常将后台处理放在主线程上,并且通常会在主线程上放置影响UI的代码)。

我的问题是:backgroundProcessing方法是否“挂起”主线程,直到它完成,因为我使用的是dispatch_sync?

修改 根据以下答案,我已实施此解决方案:

- (void)handleClickEvent {
      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
         [self backgroundProcessing];
         dispatch_async(dispatch_get_main_queue(), ^{
            [self updateUI];
         });
      });
}

来自此链接的解决方案:Completion Callbaks

1 个答案:

答案 0 :(得分:7)

是的,dispatch_sync将阻塞,直到任务完成。使用dispatch_async,当作业完成后,它会将一个块发回主队列以更新视图。