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

Ответ

Да, добавить можно, но это крайне опасно и почти всегда является ошибкой. Главная очередь (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 для работы с главной очередью.

Ответ 18+ 🔞

Слушай, вот ты мне сейчас про DispatchQueue.main.sync рассказываешь, а у меня в голове одна мысль: «Ну и нахуя?». Серьёзно, это как пытаться засунуть диван в лифт — вроде бы технически возможно, но последствия будут ебать какие предсказуемые и печальные.

Смотри, главная очередь — это святая святых, место, где твой интерфейс живёт и дышит. Ты туда с async заходишь, как вежливый гость: постучался, оставил посылку с обновлением лейбла и пошёл нахуй, не мешая другим процессам. А sync — это как вломиться в этот же дом с криком «ВСЁ СТОЯТЬ НАХУЙ, Я ОДИН ЗДЕСЬ ГЛАВНЫЙ!», заблокировать всех, включая самого себя, и начать переставлять мебель. Пиздец, а не подход.

Вот, смотри, классический способ наступить на грабли и получить этими самыми граблями по ебалу:

// А вот эта хуйня выполнится, но ты потом не плачь, что интерфейс замер
DispatchQueue.main.sync {
    self.label.text = "Новый текст, старые проблемы"
}

Но это ещё цветочки. Вот тебе ягодка — дедлок, взаимная блокировка, от которой аж ебушки-воробушки летят. Делаешь так уже ИЗ главного потока:

// ВНИМАНИЕ! КОД-УБИЙЦА! НЕ ПОВТОРЯЙ!
// Ты уже на главном потоке, сука...
DispatchQueue.main.sync { // ...и говоришь ему: "Стой, жди, пока я тут внутри поработаю"
    // А эта задача никогда не начнётся, потому что поток, который должен её запустить, САМ ЖДЁТ.
    // Замкнутый круг. Тишина. Пиздец. Приложение висит.
}

Представь: ты стоишь в очереди в кассу и требуешь у самого себя впередистоящего документы. Да ты просто идиот в этой ситуации! Вот так и тут.

Даже если ты вызовешь эту дичь с фонового потока, ты всё равно остановишь весь интерфейс. Анимации, скроллы, тапы — всё встанет колом, пока твой sync не отработает. Пользователь подумает, что приложение сдохло. И будет, в общем-то, прав.

А как надо-то, спросишь? Да элементарно, Ватсон! Используй async, как все нормальные люди:

// Всё гениальное просто. Поставил задачу в очередь и забыл.
DispatchQueue.main.async {
    self.label.text = "Всё работает, и ты не идиот"
    self.tableView.reloadData()
}

«А есть ли исключения?» — спросит дотошный школяр. Да нихуя! Ну, почти нихуя. Может, в каком-нибудь ебучем академическом примере про синхронизацию потоков, но для этого есть специальные инструменты — NSLock, семафоры, @MainActor. Не лезь со своим sync в святое место.

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