Why a sync block of code always call on main thread?

人走茶凉 提交于 2020-07-08 12:43:22

问题


I did the simple test with DispatchQueue:

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

It printed out:

Main thread

Why does this code execute on the main thread? It should be performed on a background thread (it was added to a background queue), right?


回答1:


Because it doesn't actually have to. You're blocking the main thread by using sync. iOS is choosing to just execute it on the main thread instead of bothering to switch to a background thread (of a background queue) as it doesn't really matter due to main thread being blocked anyways.

Apple's docs (and quickhelp) on the sync function include the line:

As an optimization, this function invokes the block on the current thread when possible.




回答2:


The problem is you asked the wrong question. Don't confuse queues and threads. Work with queues and let them rejigger the threads as needed. That is exactly why we have queues! You have no business worrying what thread you're on. All you need to know is that you're on the right queue, which you can find out like this:

let q = DispatchQueue.global(qos: .background)
q.sync {
    dispatchPrecondition(condition: .onQueue(q))
    print("it's okay! we're on the right queue") // yep
}


来源:https://stackoverflow.com/questions/52953947/why-a-sync-block-of-code-always-call-on-main-thread

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!