Какой QoS (Quality of Service) в DispatchQueue имеет наивысший приоритет?

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

Ответ

Наивысший приоритет у QoS: .userInteractive.

Назначение: Выполнение задач, критичных для непосредственного взаимодействия с пользователем, где задержки более нескольких миллисекунд заметны. Примеры:

  • Обновление UI анимации.
  • Обработка касаний или свайпов в реальном времени.
  • Аудио/видео обработка для live-стримов.

Важное замечание: Работа, связанная с обновлением UI, должна в конечном итоге выполняться на DispatchQueue.main. .userInteractive используется для подготовительных вычислений перед этим обновлением.

Пример:

// Плавная анимация перемещения элемента
DispatchQueue.global(qos: .userInteractive).async {
    // Интенсивные вычисления для следующего кадра анимации
    let nextFrameData = calculateNextAnimationFrame()

    // Отправка результата строго на главный поток для рендеринга
    DispatchQueue.main.async {
        self.renderFrame(nextFrameData)
    }
}

Иерархия QoS по убыванию приоритета:

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