Что такое QoS (Quality of Service) в GCD и как его использовать?

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

Ответ

QoS (Quality of Service) — это механизм в Grand Central Dispatch (GCD) для указания приоритета и характера выполняемой задачи. Он помогает системе оптимально распределять ресурсы (процессорное время, энергопотребление).

Основные классы QoS (от высокого к низкому приоритету):

  1. .userInteractive — для задач, напрямую влияющих на UI, которые должны выполняться мгновенно (анимации, обработка касаний). Использование для долгих задач заблокирует интерфейс.
  2. .userInitiated — для задач, инициированных пользователем, результат которых нужен для продолжения работы (например, открытие документа).
  3. .utility — для длительных задач, о ходе которых пользователь информирован (загрузка данных, вычисления). Может сопровождаться индикатором прогресса.
  4. .background — для задач, невидимых пользователю и не требующих немедленного завершения (индексация, синхронизация данных, предварительная загрузка).

Практический пример:

// Пользователь нажал кнопку — задача высокого приоритета
DispatchQueue.global(qos: .userInitiated).async {
    let data = self.loadCriticalData() // Долгая операция
    // Возвращаем результат в главный поток для обновления UI
    DispatchQueue.main.async {
        self.updateUI(with: data)
    }
}

// Фоновая синхронизация — низкий приоритет
DispatchQueue.global(qos: .background).async {
    self.syncDataWithServer() // Не блокирует пользователя
}

Ключевое правило: Всегда обновляйте UI в DispatchQueue.main. Правильный выбор QoS предотвращает блокировку главного потока и оптимизирует производительность и энергоэффективность приложения.