Ответ
Главная очередь (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— задачи, невидимые для пользователя (например, предварительная загрузка).