Какие приоритеты (QoS) у очередей в Grand Central Dispatch?

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

Ответ

В GCD (Grand Central Dispatch) приоритеты задач определяются классами качества обслуживания (Quality of Service, QoS). Они помогают системе оптимально распределять ресурсы (CPU, I/O, энергопотребление).

Классы QoS (от высшего к низшему):

Класс Глобальная очередь Назначение Влияние на систему
.userInteractive DispatchQueue.main Обновление UI, анимации, обработка действий пользователя. Требует мгновенного результата. Высокий приоритет, максимальная энергоэффективность не критична.
.userInitiated global(qos: .userInitiated) Задачи, инициированные пользователем, которые должны завершиться быстро для продолжения работы (например, открытие документа). Высокий приоритет, баланс между скоростью и энергопотреблением.
.default global() Стандартный приоритет по умолчанию. Не следует назначать явно. Средний приоритет.
.utility global(qos: .utility) Долгие операции, где пользователь ожидает результата, но не немедленно (загрузка, вычисления, I/O). Низкий приоритет, оптимизировано для энергоэффективности.
.background global(qos: .background) Задачи, невидимые для пользователя и не требующие завершения в определенное время (индексация, синхронизация, бэкап). Самый низкий приоритет, максимальная энергоэффективность.

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

// Критичная для UI задача
DispatchQueue.main.async {
    self.label.text = "Обновлено"
}

// Пользовательская задача, которую нужно выполнить быстро
DispatchQueue.global(qos: .userInitiated).async {
    let processedImage = self.applyFilter(to: image)
    DispatchQueue.main.async { self.imageView.image = processedImage }
}

// Долгая фоновая задача
DispatchQueue.global(qos: .background).async {
    self.syncDataWithServer()
}

Важно: Система динамически регулирует приоритеты. Например, задача .userInitiated может быть временно повышена до .userInteractive, если пользователь активно ждет её завершения.