Почему блок кода синхронизации всегда вызывается в главном потоке?
Я сделал простой тест с DispatchQueue:
DispatchQueue.global(qos: .background).sync {
if Thread.isMainThread {
print("Main thread")
}
}
Распечатано:
Main thread
Почему этот код выполняется в главном потоке? Это должно быть выполнено в фоновом потоке (он был добавлен в фоновую очередь), верно?
2 ответа
Потому что на самом деле это не обязательно. Вы блокируете основной поток с помощью синхронизации. iOS предпочитает просто выполнить его в главном потоке, вместо того, чтобы переключаться на фоновый поток (фоновую очередь), так как это не имеет большого значения, поскольку основной поток все равно блокируется.
Документы Apple (и справка) по функции синхронизации включают строку:
В качестве оптимизации эта функция вызывает блок в текущем потоке, когда это возможно.
Проблема в том, что вы задали не тот вопрос. Не путайте очереди и потоки. Работайте с очередями и дайте им перенастроить потоки по мере необходимости. Именно поэтому у нас есть очереди! Вы не должны беспокоиться о том, на какой вы нить. Все, что вам нужно знать, это то, что вы находитесь в правильной очереди, которую вы можете узнать следующим образом:
let q = DispatchQueue.global(qos: .background)
q.sync {
dispatchPrecondition(condition: .onQueue(q))
print("it's okay! we're on the right queue") // yep
}