5

我用 DispatchQueue 做了简单的测试:

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

它打印出来:

Main thread

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

4

2 回答 2

4

因为它实际上不必。您正在使用同步阻塞主线程。iOS 选择只在主线程上执行它,而不是费心切换到(后台队列的)后台线程,因为无论如何主线程都被阻塞了,这并不重要。

Apple 关于同步功能的文档(和快速帮助)包括以下内容:

作为一种优化,此函数在可能的情况下调用当前线程上的块。

于 2018-10-23T16:43:46.273 回答
2

问题是你问错了问题。不要混淆队列和线程。使用队列并让它们根据需要重新调整线程。这正是我们排队的原因!你不必担心你在哪个线程上。只需要知道您在正确的队列,您可以像这样找到它:

let q = DispatchQueue.global(qos: .background)
q.sync {
    dispatchPrecondition(condition: .onQueue(q))
    print("it's okay! we're on the right queue") // yep
}
于 2018-10-23T16:53:38.267 回答