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

Why does dispatchQueue.main give me the option of sync or async if main queue is always sync

如果主队列始终同步,为什么 dispatchQueue.main 给我选择同步或异步

dispatchQueue.main.async{
    //code
}

dispatchQueue.main.async{
    //code
}

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

dispatchQueue.main.sync{
    //code
}

所以我想知道有什么不同

Async:非阻塞,在不久的将来在特定队列的某个地方被调度。

Sync:立即在特定队列上执行。

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

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

main 队列与任何其他队列在同步或异步排队方面没有什么不同。

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

回答你的问题"Is the same as" - 不,不一样。假设两组代码都是从某个后台队列调用的,在第一组代码中,后台队列将继续移动,而不管这两个块最终何时在主队列上执行。在第二组代码中(使用sync),后台队列每次阻塞,直到每个代码块在主队列上运行。

如果两组代码都是从主队列调用的,那么会有更大的区别。第一组代码(async)继续工作。第二组代码(使用 sync)将导致主队列在第一次调用 sync 时阻塞,您的应用将变得无响应,直到用户(或 OS)终止它.

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