В чем разница между главной (main) и глобальной (global) очередью в GCD?

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

Ответ

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

Глобальные очереди (DispatchQueue.global()) — это набор параллельных (concurrent) очередей общего назначения с разными уровнями приоритета (Quality of Service, QoS). Используются для выполнения фоновых задач.

Сравнение: Характеристика Главная очередь (DispatchQueue.main) Глобальные очереди (DispatchQueue.global(qos:))
Тип Serial (последовательная) Concurrent (параллельная)
Назначение Обновление UI Фоновые задачи (сеть, вычисления, I/O)
Поток Главный поток Фоновые потоки из пула
Приоритет (QoS) .userInteractive (фактически) .userInitiated, .utility, .background и др.
Доступ Системный синглтон Системные синглтоны для каждого QoS

Правило: Все операции, изменяющие UI, должны выполняться на главной очереди.

Пример типичного паттерна:

// 1. Запускаем тяжелую задачу в фоне (глобальная очередь)
DispatchQueue.global(qos: .userInitiated).async {
    let processedImage = self.applyFilter(to: image)

    // 2. Возвращаем результат на главную очередь для обновления UI
    DispatchQueue.main.async {
        self.imageView.image = processedImage
    }
}

Уровни QoS глобальных очередей (от высокого к низкому):

  • .userInteractive — для анимаций или мгновенного отклика.
  • .userInitiated — для действий, инициированных пользователем, требующих быстрого результата.
  • .default — средний приоритет.
  • .utility — долгие задачи с индикатором прогресса (например, импорт данных).
  • .background — задачи, невидимые для пользователя (например, предварительная загрузка).