Какой QoS (Quality of Service) для DispatchQueue выбрать для фонового обновления документа?

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

Ответ

Рекомендуемый QoS: .userInitiated.

Почему .userInitiated?

  • Обновление документа — это задача, инициированная пользователем (например, сохранение).
  • Она должна выполниться быстро, чтобы пользователь мог продолжить работу без ощущения задержки.
  • Система выделит достаточно ресурсов для своевременного выполнения.

Пример:

// Пользователь нажал "Сохранить"
DispatchQueue.global(qos: .userInitiated).async {
    // Критическая фаза: сериализация данных и запись на диск
    self.saveDocumentToDisk()

    // Возвращаем результат в главный поток
    DispatchQueue.main.async {
        self.updateUIAfterSave()
    }
}

Альтернативы и когда их использовать:

  • .utility — для периодического автосохранения. Задача важна, но не требует мгновенной реакции, может выполняться с более низким приоритетом.
  • .backgroundНЕ рекомендуется для непосредственного обновления документа, так как система может сильно ограничить или отложить выполнение. Подходит для чистки временных файлов или логов, связанных с документом.
  • .default — средний приоритет. Используйте, если нет четких требований, но .userInitiated обычно предпочтительнее для отзывчивости.