我已阅读有关GCD and Dispatch Queue in Swift 3
的教程但我对同步执行和异步执行以及主队列和后台队列的顺序感到困惑。
我知道如果我们使用 sync ,那么我们会在宝贵的一个之后执行它们,如果我们使用 async 那么我们可以使用 QoS 来设置优先级,但这种情况怎么样?
func queuesWithQoS() {
let queue1 = DispatchQueue(label: "com.appcoda.myqueue1")
let queue2 = DispatchQueue(label: "com.appcoda.myqueue2")
for i in 1000..<1005 {
print(i)
}
queue1.async {
for i in 0..<5{
print(i)
}
}
queue2.sync {
for i in 100..<105{
print( i)
}
}
}
结果表明我们忽略了异步执行。我知道queue2应该在queue1之前完成,因为它是同步执行但是为什么我们忽略了异步执行和 异步,同步和所谓的主队列之间的实际区别是什么?
答案 0 :(得分:4)
你说:
结果表明我们忽略了异步执行。 ...
不,这只是意味着你没有给异步调度代码足够的时间来开始。
我知道queue2应该在queue1之前完成,因为它是同步执行...
首先,queue2可能无法在queue1之前完成。它恰好发生了。使queue2做得慢得多(例如循环几千次而不是只有五次),你会发现queue1实际上可以与queue2上的内容同时运行。它只需要几毫秒的时间就可以开始运行,而非常简单的queue2上的东西在queue1上的东西有机会启动之前就已经完成了。
其次,这种行为在技术上并不是因为它是同步执行。只是异步需要几毫秒的时间才能让它在某个工作线程上运行,而同步调用由于我不会厌烦你的优化,会更快地启动。
但为什么我们忽略了异步执行......
我们不“忽视”它。开始只需几毫秒。
async,sync和所谓的主队列之间的实际区别是什么?
“异步”仅仅意味着当前线程可以继续而不是等待调度代码在某个其他线程上运行。 “同步”表示当前线程应该等待分派的代码完成。
“主线程”是一个不同的主题,只是指为驱动UI而创建的主线程。在实践中,主线程是大多数代码运行的地方,基本上运行除手动调度到某个后台队列的所有内容(或者为您调度的代码,例如URLSession
完成处理程序)。
答案 1 :(得分:2)
sync
和async
与同一个线程/队列相关。要查看差异,请运行以下代码:
func queuesWithQoS() {
let queue1 = DispatchQueue(label: "com.appcoda.myqueue1")
queue1.async {
for i in 0..<5{
print(i)
}
}
print("finished")
queue1.sync {
for i in 0..<5{
print(i)
}
}
print("finished")
}
主队列是整个用户界面(UI)运行的线程。
答案 2 :(得分:2)
首先,我更喜欢使用术语“延迟”而不是“忽略”代码执行,因为您的问题中的所有代码都已执行。
QoS 是enum,第一个类表示最高优先级,最后一个表示最低优先级,当您没有指定任何优先级时,您有一个默认优先级,默认位于中间:
说,你有两个同步 for-in 循环和一个async,其中优先级取决于循环的位置和代码中的队列类型(sync / async)因为这里我们有3个不同的队列(关于link queuesWithQoS()
的说明可以在viewDidAppear
中启动,所以我们可以假设在主队列中)< / p>
代码显示创建两个具有默认优先级的队列,因此执行的顺序为:
在执行所有UI指令的情况下,主队列始终具有最高优先级。