Ответ
При вызове DispatchQueue.sync блокируется текущий поток, с которого был выполнен этот вызов. Поток приостанавливается и ожидает, пока задача, отправленная в очередь, не будет выполнена полностью.
Пример и порядок выполнения:
print("1. Перед sync")
// Текущий поток (например, main) блокируется здесь
DispatchQueue.global().sync {
for i in 2...4 { print("(i). Внутри sync-блока") }
}
// Эта строка выполнится только после завершения блока выше
print("5. После sync")
// Вывод: 1, 2, 3, 4, 5
Критически важное предупреждение:
- Deadlock (взаимная блокировка): Вызов
DispatchQueue.main.syncиз того же main thread приведёт к deadlock, так как поток будет ждать завершения задачи, которую он же и должен выполнить.// НЕ ДЕЛАЙТЕ ТАК! Это вызовет deadlock на главном потоке. DispatchQueue.main.sync { print("Этот код никогда не выполнится") } - Использование:
syncполезен, когда вам нужно дождаться результата на текущем потоке, например, для синхронизации доступа к общему ресурсу.