可以dispatch_async中断调用任务

Srđ*_*đan 4 objective-c grand-central-dispatch ios swift

假设我将一个任务异步调度到一个队列:

{
    // 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")
    ...
}
Run Code Online (Sandbox Code Playgroud)

可以在任何情况下调度任务中断发送它的任务吗?换句话说,在打印所有"任务A"之前,是否会发生"任务B"的打印?

task A
task B
task A
task A
...
Run Code Online (Sandbox Code Playgroud)

或GCD将保证:

task A
task A
task A
...
task B
Run Code Online (Sandbox Code Playgroud)

如果将任务分派到调用dispatch_async的同一队列,它会有什么不同吗?

Rob*_*Rob 5

换句话说,在打印所有"任务A"之前,是否会发生"任务B"的打印?

绝对可能发生.如果要异步调度到(a)不同的队列; 或者(b)并发队列(以及全局队列是并发队列),您明确要求它们相互并发运行.

确切的序列AB日志消息是各种任务的耗时,队列的优先级等等的函数.但是如果你想B在所有A任务之后才显示,那么你应该明确地控制它行为(通知发送组,串行队列,障碍等的块).

如果您告诉我们您想要保证的行为,我们可以告诉您如何做到这一点.