Ответ
Вызов DispatchQueue.global().sync { ... } выполняет переданный блок кода синхронно на глобальной concurrent очереди.
Последствия:
- Блокировка вызывающего потока: Текущий поток приостанавливается и ждет, пока блок не выполнится полностью.
- Выполнение на фоновом потоке: Блок будет выполнен на одном из потоков системной глобальной очереди (не на главном).
- Порядок выполнения: Несмотря на то, что
DispatchQueue.global()— concurrent очередь,syncзаставляет блок выполняться последовательно относительно вызывающего кода.
Пример, демонстрирующий блокировку:
print("Task 1 started on main thread")
DispatchQueue.global().sync {
// Этот блок выполняется на фоновом потоке, НО main thread ждет его завершения.
Thread.sleep(forTimeInterval: 1)
print("Task 2 executed on global queue")
}
// Эта строка напечатается только после завершения блока выше.
print("Task 3 continues on main thread")
// Вывод: "Task 1 started...", (пауза 1 сек), "Task 2 executed...", "Task 3 continues..."
⚠️ Важное предупреждение о взаимоблокировке (deadlock):
// НЕ ДЕЛАЙТЕ ТАК. Это вызовет deadlock.
DispatchQueue.main.sync {
// Этот код никогда не выполнится, потому что main thread
// заблокирован внешним вызовом и ждет этого блока,
// но сам блок тоже требует main thread.
}
// Вызов `sync` на текущей очереди (или на очередь, которая ждет текущую) приводит к deadlock.