这个问题是关于Grand Central Dispatch,尤其是dispatch_group_wait()

假设一个名为dispatch_groupgroup具有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/

10-09 04:58