Что произойдёт при вызове DispatchQueue.main.sync из главного потока?

«Что произойдёт при вызове DispatchQueue.main.sync из главного потока?» — вопрос из категории Многопоточность, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Произойдёт взаимная блокировка (deadlock). Главный поток заблокируется, ожидая выполнения блока кода, который никогда не начнётся, потому что очередь занята этим же потоком.

Пример кода, вызывающего deadlock:

// Вызов из главного потока
DispatchQueue.main.sync {
    print("Этот код никогда не выполнится")
}
// Поток заблокирован здесь навсегда

Правильное решение: Всегда используйте async для работы с главной очередью из главного же потока.

DispatchQueue.main.async {
    print("Код выполнится в следующем цикле run loop")
}

Причина: Метод sync добавляет задачу в очередь и блокирует текущий поток до её завершения. Главный поток не может обработать новую задачу, пока сам заблокирован, что создаёт тупиковую ситуацию.