我需要帮助,以更好地理解如何在Swift中工作并发。
我有密码:
DispatchQueue.main.async {
DispatchQueue.main.async {
print("A")
DispatchQueue.main.async {
print("B")
}
print("C")
}
print("D")
}结果:D A C B
我想"D“只是因为一个原因,第一个Dispatch块的执行由两个步骤组成:
它比执行print("D")花费更多的时间。是那么回事吗?
当我试验并发队列时,在其中一个例子中,我得到了下一个结果:A、D、C、B、。
为什么会这样?
并发队列代码:
DispatchQueue.global(qos: .utility).async {
DispatchQueue.global(qos: .utility).async {
print("A")
DispatchQueue.global(qos: .utility).async {
print("B")
}
print("C")
}
print("D")
}发布于 2019-02-07 09:13:04
这种行为的原因是可以有许多具有相同QoS的全局队列,但是总是只有一个主队列。
您的第一个示例是可预测的-它的行为总是相同的,因为您总是将任务分配到同一个队列- main。与async一起提交的任务将异步执行(这意味着async函数将立即返回),但在当前执行的任务完成之前,新任务不会开始执行。下面是一个简化的模型来描述所发生的事情:
Task 1:
Submit task 2
Print "D"
Task 2:
Print "A"
Submit task 3
Print "C"
Task 3:
Print "B"Task 1包括提交Task 2和打印材料。Task 1在主队列上运行,Task 2被添加到同一个队列中。这意味着在当前运行的任务-- Task 2 --完成执行之前,Task 1无法启动。
第二个例子有点不同。每次调用DispatchQueue.global时,都会保证得到一个具有特定QoS的队列,但它不一定是相同的队列。您分配给print("A")的队列似乎没有任何其他任务挂起,并且能够在async方法返回之前立即执行其工作。
使用以前提供的模型--如果将Task 2添加到与运行Task 1不同的队列中,则不需要等待Task 1完成执行。但是,在这种情况下,这取决于每次调用DispatchQueue.global时得到的队列,而这并不是保证的。
https://stackoverflow.com/questions/54569619
复制相似问题