Что произойдёт, если добавить синхронную задачу (sync) в главную очередь (DispatchQueue.main)?

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

Ответ

Да, добавить можно, но это крайне опасно и почти всегда является ошибкой. Главная очередь (DispatchQueue.main) — это серийная очередь, предназначенная для обновления UI.

Код, который выполнится, но вызовет проблемы:

// Эта задача выполнится, но заблокирует главный поток
DispatchQueue.main.sync {
    self.label.text = "New Text"
}

Критические риски:

  1. Deadlock (взаимная блокировка), если вызвать из главного потока:

    // ВЫЗОВЕТ DEADLOCK! Код зависнет.
    // Выполняется уже на главном потоке...
    DispatchQueue.main.sync {
        // Эта задача никогда не начнётся,
        // потому что главный поток ждёт её завершения.
    }

    Главный поток блокирует сам себя, ожидая выполнения задачи, которую не может начать.

  2. Блокировка пользовательского интерфейса: Даже если вызов sync происходит с фонового потока, он остановит все обновления UI и обработку жестов до своего завершения, вызывая "зависание" приложения.

Правильная альтернатива — async:

// Всегда используйте async для обновления UI
DispatchQueue.main.async {
    self.label.text = "New Text"
    self.tableView.reloadData()
}

Исключительные случаи для sync: Практически отсутствуют. Единственный гипотетический сценарий — синхронизация доступа к общему ресурсу из нескольких потоков, но для этого существуют более подходящие примитивы (NSLock, DispatchSemaphore, @MainActor).

Вывод: Использование DispatchQueue.main.sync — это антипаттерн. Всегда используйте async для работы с главной очередью.