我用DispatchQueue做了简单的测试:
DispatchQueue.global(qos: .background).sync {
if Thread.isMainThread {
print("Main thread")
}
}
它打印出来了:
Main thread
为什么此代码在主线程上执行?应该在后台线程上执行(它已添加到后台队列中),对吧?
答案 0 :(得分:3)
因为实际上没有必要。您正在使用同步来阻止主线程。 iOS选择只在主线程上执行它,而不是费心切换到(后台队列的)后台线程,因为这实际上并不重要,因为无论如何主线程都被阻塞了。
关于同步功能的Apple文档(和快速帮助)包括以下行:
作为一种优化,此函数在可能的情况下在当前线程上调用该块。
答案 1 :(得分:1)
问题是您问错了问题。不要混淆队列和线程。处理队列,并根据需要让 them 重新调整线程。这就是为什么我们要排队!您不必担心正在使用什么 thread 。您需要知道的所有 都是正确的 queue :
let q = DispatchQueue.global(qos: .background)
q.sync {
dispatchPrecondition(condition: .onQueue(q))
print("it's okay! we're on the right queue") // yep
}