这个问题是关于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
,在等待任务之前进行“切入”,还是维持它们被调用的顺序?
我搜索了文档,但未能找到这个问题的答案......
答案 0 :(得分:3)
dispatch_group_wait
和dispatch_group_notify
都会等待已进入群组的项目数转换为零。因此,如果您在所有原始十个任务完成之前向该组添加第十一个任务,则对dispatch_group_wait
的调用将等待所有十一个任务完成,然后继续。
答案 1 :(得分:2)
组是一个+/-计数器(信号量),每次达到零时都会触发。它不知道任务,因为dispatch_group_async()只是在任务提交之前进入()s组的包装器,并将一个新块排入队列,该块将调用任务的块然后离开()该组。这就是全部。甚至可以在没有队列的情况下使用组作为异步保留计数器或sml。
所以一般来说,#34;你不能"。
但是,如果您能够[重新]将所有相关队列(dispatch_set_target_queue())定位到单个并发队列,那么该队列上的dispatch_barrier_async()可以执行您想要的操作(如果在适当的隔离中调用)。请注意,该组与此无关。
另外,原始的lonelyTask不是从组的角度来看的任务 - 它是不相关的执行线程,等到组平衡。 "在线切割的同义词"是一个障碍"。
另一种方法是为每个任务集创建一个私有组,并等待该特定组。这不会插入障碍 - 下面的任务不会等待lonelyTask的完成,任何不受控制的async()可能会违反规则"导致有趣的调试会话。