为什么同步代码块总是在主线程上调用?

时间:2018-10-23 16:37:45

标签: ios swift concurrency dispatch-queue

我用DispatchQueue做了简单的测试:

DispatchQueue.global(qos: .background).sync {
  if Thread.isMainThread {
    print("Main thread")
  }
}

它打印出来了:

Main thread

为什么此代码在主线程上执行?应该在后台线程上执行(它已添加到后台队列中),对吧?

2 个答案:

答案 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
}