По каким критериям выбирается качество обслуживания (QoS) для DispatchQueue в iOS?

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

Ответ

Выбор DispatchQoS определяется приоритетом задачи и её влиянием на пользовательский опыт и энергоэффективность.

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

QoS Назначение Критерий выбора Пример
.userInteractive Задачи, критичные для немедленного отклика UI (< 16 мс). Анимации, обновления интерфейса в реальном времени. Плавный скролл, анимация прогресса.
.userInitiated Задачи, запущенные действием пользователя, результат которых нужен для продолжения работы. Пользователь нажал кнопку и ожидает быстрого результата. Поиск по локальной БД, применение фильтра.
.utility Длительные задачи, о ходе которых пользователь информирован. Операции, допускающие небольшой прогресс. Загрузка файла, обработка изображения, длительные вычисления.
.background Задачи, невидимые для пользователя, время выполнения не критично. Обслуживание, синхронизация, предварительная загрузка. Индексация, создание бэкапа, синхронизация данных в фоне.
.default Средний приоритет. Используется, если QoS не указан явно. Задачи без строгих требований к скорости или энергопотреблению.

Практические рекомендации:

  • Избегайте .userInteractive для ресурсоёмких операций – это может заблокировать главный поток и привести к лагам интерфейса.
  • Для цепочек задач используйте DispatchWorkItemFlags.inheritQoS или sync(execute:), чтобы дочерняя задача наследовала приоритет родительской.
  • В Swift Concurrency приоритеты задаются через параметр priority: в Task и автоматически маппируются на соответствующие QoS-классы GCD.

Пример:

// Фоновая задача для синхронизации
DispatchQueue.global(qos: .background).async {
    self.syncDatabase()
}

// Swift Concurrency эквивалент
Task(priority: .background) {
    await self.syncDatabase()
}