Iphone 如何同步不同调度队列中的任务?

Iphone 如何同步不同调度队列中的任务?,iphone,objective-c,ios,grand-central-dispatch,Iphone,Objective C,Ios,Grand Central Dispatch,我是队列新手,在设置以下方案时遇到了一些问题 我有三项任务需要做 任务A:只能在主队列上运行,可以与任务B异步运行,不能与任务C异步运行。运行很多,但运行速度相当快 任务B:可以在任何队列上运行,可以与任务A异步运行,不能与任务C异步运行。很少运行,但运行时间较长。之后需要运行任务C,但任务C不能与任务A异步运行 任务C:可以在任何队列上运行。无法与任务A或任务B异步运行。很少运行,而且运行速度很快 现在我有这样一个: 任务A通过串行队列X提交到主队列(任务提交到串行队列X以将任务A提交到主队列

我是队列新手,在设置以下方案时遇到了一些问题

我有三项任务需要做

任务A:只能在主队列上运行,可以与任务B异步运行,不能与任务C异步运行。运行很多,但运行速度相当快

任务B:可以在任何队列上运行,可以与任务A异步运行,不能与任务C异步运行。很少运行,但运行时间较长。之后需要运行任务C,但任务C不能与任务A异步运行

任务C:可以在任何队列上运行。无法与任务A或任务B异步运行。很少运行,而且运行速度很快

现在我有这样一个:

任务A通过串行队列X提交到主队列(任务提交到串行队列X以将任务A提交到主队列)

任务B被提交到串行队列X

任务C通过串行队列X提交到主队列,就像任务A一样

这里的问题是任务C有时与任务B同时运行。主队列有时与串行队列运行任务B同时运行任务C


那么,如何确保任务B和任务C不会同时运行,同时仍允许A和B同时运行,并防止A和C同时运行?此外,有没有简单的方法确保它们运行相同的次数?(前后交替)

您是否签出NSOperation以同步您的操作?你可以在那里处理依赖关系。

你知道,我想我的GRE考试有这个问题,只有A、B和C是鲍勃、拉里和苏,他们都在同一个办公室工作

我相信这可以通过串行队列和调度信号量的组合来解决。如果您设置了一个宽的串行调度队列并将任务B和C提交给该队列,则可以保证它们不会同时运行。然后,您可以使用计数设置为1的分派信号量,该信号量在任务a和C之间共享,以保证一次只运行其中一个。我在回答中描述了这样一个信号量是如何工作的。您可能需要修改该代码以使用
DISPATCH\u TIME\u FOREVER
,这样任务A在提交之前就被推迟,而不是在C正在运行时被扔到一边(对于提交C也是如此)

这样,A和B将在不同的队列(主队列和串行队列)上运行,因此它们可以并行执行,但B和C不能同时运行,因为它们是共享队列,A和C也不能同时运行,因为信号量


就A和C上的负载平衡而言(我假设您想要平衡),这可能是相当特定于应用程序的,并且可能需要您进行一些实验,以了解如何在不浪费周期的情况下正确地交错操作。我还要确保你真的需要它们均匀地交替,或者如果你能让一个运行得比另一个稍微多一些的话。

当然,有一种更简单的方法,假设C必须始终遵循a和B,也就是将a和B计划C作为它们自己操作的完成回调(并进行C检查以确保它尚未运行,以防A和B都要求同时运行)。完成回调模式(在dispatch_async手册页中描述)非常强大,是序列化需要耦合的异步操作的好方法


如果问题是A、B、C、D和E,其中A-D可以异步运行,E必须始终在最后运行,调度组是一个更好的解决方案,因为您可以将E设置为运行整个组的完成回调,然后只需将A-E放在该组中。

完美,这正是我需要做的。非常感谢!