假设我将任务异步分派(dispatch)到队列:

{
    // we are on main queue

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
      print("task B")
    });

    print("task A")

    // some long running work

    print("task A")

    // some long running work

    print("task A")
    ...
}

在任何情况下分派(dispatch)的任务都可以中断派发它的任务吗?换句话说,有没有可能在打印所有“任务 A”之前打印“任务 B”?
task A
task B
task A
task A
...

或者 GCD 会保证这一点:
task A
task A
task A
...
task B

如果任务被分派(dispatch)到调用 dispatch_async 的同一个队列,会有什么不同吗?

最佳答案



绝对有可能发生。如果您要异步分派(dispatch)到 (a) 不同的队列中;或 (b) 并发队列(并且全局队列是并发队列),您明确要求它们彼此同时运行。
AB 日志消息的确切顺序取决于各种任务的耗时、队列的优先级等。但是如果您希望 B 直到所有 A 任务完成后才显示,那么您应该明确控制该行为(通知调度组、串行队列、屏障等的块)。

如果您告诉我们您想保证什么行为,我们可以告诉您如何做到这一点。

10-08 03:06