GCD - 如何在主线程上等待在主队列上执行的异步回调

Posted

技术标签:

【中文标题】GCD - 如何在主线程上等待在主队列上执行的异步回调【英文标题】:GCD - How to wait on the main thread for an async callback that is performed on the main queue 【发布时间】:2014-06-27 17:34:43 【问题描述】:

我想一个接一个地执行 2 个块,其中每个块都是异步执行的。

例如

[someMethodWithCompletionHandler:^() 
  // do something in the completion handler
];

[anotherMethodWithCompletionHandler:^ 
  // do something else in the completion handler after the first method completes
];

现在,我需要在“someMethodWithCompletionHandler”完成(包括其完成处理程序)之后发生“anotherMethodWithCompletionHandler

我通常会创建一个dispatch_group 并在两个方法之间等待(我不能将这两个方法嵌套在另一个完成处理程序中,因为它需要移动大量代码)

但问题是在主线程中调用了第一个完成处理程序块(由方法本身在主线程中调用该块),因此我无法有效地创建一个 dispatch_group 阻塞主线程。

所以线程状态看起来像这样

// main thread here

[self doFirstPortionOfWork];

// main thread here
[self doSecondPortionOfWork];


-(void)doFirstPortionOfWork

.. a lot of stuff happening
  [someMethodWithCompletionHandler:^
  // this is the main thread
  ];
// would like to block the return here until the completion handler finishes


-(void)doSecondPortionOfWork

... a lot of work here
  [anotherMethodWithCompletionHandler^
  // this is also called into the main thread
  ];
// would like to block the return here until the completion handler finishes

那么,如果不使用大量嵌套方法并且能够阻塞主线程直到全部完成,我怎么能做到这一点呢?

【问题讨论】:

【参考方案1】:

主线程与主队列相同

不可能在主线程上等待未来在主线程中的工作。你正在阻止未来的工作。

你可以这样做:

[someMethodWithCompletionHandler:^() 
    // do something in the completion handler
    [anotherMethodWithCompletionHandler:^ 
       // do something else in the completion handler after the first method completes
    ];
];

【讨论】:

我不能这样做,因为我没有嵌套 我不明白“我没有嵌套”是什么意思。

以上是关于GCD - 如何在主线程上等待在主队列上执行的异步回调的主要内容,如果未能解决你的问题,请参考以下文章

GCD 全局队列任务在主线程上运行

伟大的GCD和NSOperationQueue

iOS--关于GCD的一些疑惑

javascript事件环(EventLoop)

为啥 NSManagedObjectContext 队列在主线程上执行?

我们可以在后台队列中生成 Realm 结果并在主线程上使用它吗