这个问题是关于Grand Central Dispatch,尤其是dispatch_group_wait()
。
假设一个名为dispatch_group
的group
具有10个等待执行的任务。
在其他地方,我有一个任务需要等待group
中的所有任务完成后才能执行。为此,我使用dispatch_group_wait(group, DISPATCH_TIME_FOREVER)
。
为了区别于group
中的任务,我将其称为lonelyTask
。
如果在等待group
时又将另一个任务添加到lonelyTask
中,该任务将首先执行,那么lonelyTask
还是添加到group
的任务?换句话说,是在另一个任务正在等待执行时添加到group
中的任务在等待任务之前“切入”,还是保持它们的调用顺序?
我已经搜索了文档,但无法找到该问题的答案...
最佳答案
组是一个+/-计数器(信号量),每次达到零时都会触发。它不知道任务,因为dispatch_group_async()只是在任务提交之前进入()s组的包装器,并排队一个新块,该新块将调用任务的块,然后离开()该组。就这样。组甚至可以在没有队列的情况下用作异步保留计数器或sml。
因此,总的来说,“你不能”。
但是,如果您能够将所有相关队列[重新]定位(dispatch_set_target_queue())为一个并发队列,那么,如果以适当的隔离进行调用,则该队列上的dispatch_barrier_async()可能会做您想要的事情。请注意,该组与此无关。
另外,从组的角度来看,原始的lonelyTask并不是任务-它是不相关的执行线程,一直等到组达到平衡为止。 “插入行”的同义词是“障碍”。
另一种方法是为每个任务集创建一个专用组,然后等待该特定组。但是,这不会插入障碍-后续任务将不会等待lonelyTask的完成,任何不受控制的async()都可能“违反规则”,从而导致有趣的调试会话。
关于ios - dispatch_group_wait是否允许插入?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30607991/