Какой тип у главной очереди (DispatchQueue.main) в GCD: серийный или конкурентный?

Ответ

Главная очередь (DispatchQueue.main) — это серийная (serial) очередь. Она выполняет задачи строго последовательно, одна за другой, и привязана к главному потоку приложения.

Почему это важно? UI-фреймворки (UIKit, SwiftUI) не являются потокобезопасными. Все операции с пользовательским интерфейсом должны выполняться на этой очереди.

Пример использования:

// Обновление UI после сетевого запроса
DispatchQueue.main.async {
    self.titleLabel.text = "Новый заголовок"
    self.tableView.reloadData()
}

Ключевое правило: Не выполняйте блокирующие или ресурсоёмкие операции (сеть, обработка изображений, сложные вычисления) на главной очереди. Это приведёт к "фризам" интерфейса. Для фоновых задач используйте глобальные конкурентные очереди (DispatchQueue.global(qos: .background)) или создавайте собственные серийные очереди.

Ответ 18+ 🔞

А, слушай, смотри, главная очередь, она же DispatchQueue.main — это такая, понимаешь, серийная (serial) очередь. Это как очередь в единственный сортир на стройке: кто первый зашёл, тот первый и вышел, следующий ждёт. Задачи там выполняются строго по очереди, одна за другой, и главное — она привязана к главному потоку приложения, где весь интерфейс и живёт.

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

Вот, смотри, как этим пользоваться, чтобы не вышло пиздеца:

// Допустим, ты получил данные из сети и хочешь обновить интерфейс
DispatchQueue.main.async {
    self.titleLabel.text = "Новый заголовок"
    self.tableView.reloadData()
}

Всё просто: говоришь системе — «эй, как освободишься на главной, сделай вот этот кусочек кода».

И главное, блядь, правило, которое надо выжечь на жопе:
Не вздумай выполнять на главной очереди какую-то тяжёлую хуйню! Сеть, обработку фоток размером с твою мамку, сложные вычисления — всё это строго нахуй отсюда. Если заблокируешь главную очередь, интерфейс просто встанет колом, пользователь будет пялиться на застывший экран, а потом удалит твое приложение с ебальником недовольным. Для всей этой фоновой работёнки используй глобальные конкурентные очереди (DispatchQueue.global(qos: .background)) или заведи себе какую-нибудь отдельную серийную очередь, чтобы там втихую всё ебал.