多个dispatch_async()完成后回调

时间:2014-02-15 21:35:07

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

我正在发送一系列类似的行动:

for (int x = 0; x < 1000; x++)
   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul), 
   ^{
       //Do stuff
   });

一旦所有这些方法都执行完毕,我想调用另一个方法[self someMethod];或调度另一个方法,那么哪个方法无关紧要。

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:1)

您可以使用调度组或调度屏障。两者都有很好的记录。

然而,这种并发 - 大规模调度到异步队列 - 几乎可以保证缓慢,资源匮乏,并且很可能导致您的应用程序被放弃以供内存使用。< / p>

如果线程尚不可用于启动处理,则异步分派必须生成一个线程。根据定义,不能以任何方式限制对全局并发队列的异步调度,因为当块A对块B具有依赖性时这样做会非常快地导致随机死锁,但是块A在块A完成之前被阻止执行(例如)。

并发总是被限制。

答案 1 :(得分:1)

我过去使用的技术是使用有限量的并发(例如3个并发操作)来创建NSOperationQueue,然后将每个块分派为NSBlockOperation。最后,我创建了一个完成NSBlockOperation,它依赖于所有其他操作的完成。我将所有操作排入队列,包括完成操作。 NSOperations的依赖构造导致独立构造在最终完成操作开始之前完成。

这种方法提供了在一堆其他块完成后完成工作的能力,并且它减少了一次启动一堆线程并等待它们全部完成的整体影响。

请参阅NSOperation类(https://developer.apple.com/library/mac/documentation/cocoa/Reference/NSOperation_class/Reference/Reference.html#//apple_ref/occ/cl/NSOperation

的addDependency:方法