假设我将一个任务异步调度到一个队列:
{
// 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")
...
}
在任何情况下调度任务都可以中断调度它的任务吗?换句话说,它是否会发生在"任务B"在所有"打印任务A" -s之前打印?
task A
task B
task A
task A
...
或GCD将保证:
task A
task A
task A
...
task B
如果将任务分派到调用dispatch_async的同一队列,它会有什么不同吗?
答案 0 :(得分:5)
换句话说,在打印所有“任务A”之前,是否会发生“任务B”的打印?
绝对可能发生。如果要异步调度到(a)不同的队列;或者(b)并发队列(以及全局队列是并发队列),您明确要求它们相互并发运行。
A
和B
日志消息的确切顺序取决于各种任务的耗时,队列的优先级等等。但是如果你想要{{1}要在所有B
任务之后才显示,那么您应该明确地控制该行为(通知发送组,串行队列,障碍等的块)。
如果您告诉我们您想要保证的行为,我们可以告诉您如何做到这一点。
答案 1 :(得分:1)
换句话说,它是否会发生在"任务B"在所有"打印任务A" -s之前打印?
这不是不可能的,我也不会说这里的任何内容都是保证。异步意味着你告诉运行时"无论何时,伙计" (假设您喜欢与运行时交谈)。
如果dispatch_async
与调用的队列位于同一队列,和该队列是串行队列,那么您的上一个场景 保证:在当前块完成之前,我们无法在该队列上启动新块。 (但DISPATCH_QUEUE_PRIORITY_DEFAULT 不是一个串行队列。)
答案 2 :(得分:0)
如果你想成为" B"毕竟打印出来,你可以保证:
// we are on main queue
print("task A")
// some long running work
print("task A")
// some long running work
print("task A")
...
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
^{
print("task B")
});
显然这没有道理,如果As是长跑者而B是短跑者。
对不起,对我而言,看起来有点你不明白,GCD是为了什么。也许您想告诉我们,您真正的具体情况是什么以及您希望在该情景中完成什么。