В большинстве случаев я бы ожидал , что эти два блока будут работать в одной и той же очереди.На самом деле, давайте посмотрим:
import Foundation
let queue1 = DispatchQueue(label: "one")
let queue2 = DispatchQueue(label: "two")
queue1.sync {
let importantValue1 = "importantValue1"
print(Thread.current) // Print the current queue
let importantValue2: String = queue2.sync {
print(Thread.current) // Print the current queue
return "importantValue2"
}
print("did important work, got values", importantValue1, importantValue2)
}
<NSThread: 0x6000023b2900>{number = 1, name = main}
<NSThread: 0x6000023b2900>{number = 1, name = main}
did important work, got values importantValue1 importantValue2
Да, в моем примере оба запускаются в главном потоке, как вы обычно этого хотите.Часто нет причин налагать большие затраты на переключение потоков при вызове .sync
.Текущий поток не может ничего сделать до тех пор, пока блок не завершится, поэтому он может также запустить этот блок в текущем потоке, если для этого нет никаких ограничений (например, блоки, отправленные в основную очередь , должны запустить в главном потоке).
Вы правы, что для этого возможно генерировать взаимные блокировки, если вы не будете осторожны, но это не из-за используемого потока.Тупиковая ситуация связана с использованием .sync
по кругу.Независимо от того, какой базовый поток используется, очередь все равно должна отправлять блоки в определенном порядке, и именно это чаще всего создает тупики.