确保在主线程上执行完成块

时间:2014-08-14 22:01:23

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

我有以下代码。我是否需要第二个dispatch_async或者将在主线程上执行完成块,因为在主线程上调用了func2?

- (void)func1
{
   dispatch_async(dispatch_get_main_queue(), ^() {
      [self func2];
   });
}

- (void)func2
{
   [self.object someLongNetworkOperationWithCompletionBlock: ^() {
       dispatch_async(dispatch_get_main_queue(), ^() {
          // Update some UI elements here
       });
   }]
}

1 个答案:

答案 0 :(得分:2)

这完全取决于实际方法someLongNetworkOperationWithCompletionBlock:的实现。它调用参数块的任何队列都是它将运行的队列。如果您正在该方法中的后台队列上执行代码并希望它始终在main上调用该块,请将GCD调用直接放在该方法中。

执行此操作的方法的实现如下所示:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^()
                 {
                     // execute code on background queue
                     dispatch_async(dispatch_get_main_queue(), ^()
                                    {
                                        // call completion block on main
                                        completion();
                                    });
                 });