Ответ
Выбор 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()
}