如果主队列始终同步,为什么dispatchQueue.main会为我提供同步或异步选项

时间:2017-07-19 19:26:12

标签: swift asynchronous grand-central-dispatch

为什么如果主队列始终同步,dispatchQueue.main会为我提供同步或异步选项

dispatchQueue.main.async{
    //code
}

dispatchQueue.main.async{
    //code
}

相同
dispatchQueue.main.sync{
    //code
}

dispatchQueue.main.sync{
    //code
}

所以我想知道是否有任何差异

2 个答案:

答案 0 :(得分:4)

main队列与任何其他队列没有区别,关于你是否可以同步或异步地将某些内容排入队列。

您必须遵守的唯一规则是永远不要使用sync将某些内容排入当前正在使用的同一队列中。这将导致僵局。同样,无论队列,主要还是其他方式都是如此。

回答你的问题"和#34; 相同 - 不,它不一样。假设从一些后台队列调用两组代码,在第一组代码中,后台队列将继续移动,而不考虑两个块何时最终在主队列上执行。在第二组代码中(使用sync),后台队列每次都会阻塞,直到每个代码块在主队列上运行。

如果从主队列中调用两组代码,则存在更大的差异。第一组代码(async)继续工作。第二组代码(带sync)将导致主队列在第一次调用sync时阻塞,并且您的应用将无响应,直到用户(或操作系统)将其杀死为止。

主队列和其他队列之间唯一可能相关的区别是主队列始终是串行队列,而后台队列可以是串行队列或并发队列。但是,只要您避免在两个队列都相同的情况下使用sync,两者都可以有效地使用asyncsync

答案 1 :(得分:1)

异步:非阻塞,在不久的将来某个特定队列上安排。

同步:立即在该特定队列上执行。

您所谈论的是您在主线程上执行代码并在同一队列上调度asynchronoussynchronous的情况。对于async,这没有问题,因为当该队列上有可用的时隙时,该块会在不久的将来某处安排。但是,在与其调用的队列相同的队列上执行的sync块可能会死锁。

这不仅适用于主队列,也适用于任何其他队列,因此,如果要同步调度到队列,请确保该队列是另一个队列,然后是当前正在处理的队列。