我正在发送一系列类似的行动:
for (int x = 0; x < 1000; x++)
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul),
^{
//Do stuff
});
一旦所有这些方法都执行完毕,我想调用另一个方法[self someMethod];
或调度另一个方法,那么哪个方法无关紧要。
我怎样才能做到这一点?
答案 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:方法