Когда использовать NSOperation и NSOperationQueue в iOS?

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

Ответ

Используйте NSOperation (и его подклассы) вместе с NSOperationQueue, когда требуется высокоуровневый контроль над выполнением задач, который GCD предоставляет не в полной мере.

Ключевые преимущества и сценарии:

  1. Зависимости между задачами. Можно явно указать, что одна операция должна начаться только после завершения других.
    let downloadOp = BlockOperation { /* Загрузка данных */ }
    let parseOp = BlockOperation { /* Парсинг данных */ }
    parseOp.addDependency(downloadOp) // Парсинг ждет загрузку
    let queue = OperationQueue()
    queue.addOperations([downloadOp, parseOp], waitUntilFinished: false)
  2. Управление состоянием и отмена. Операции имеют состояния (isReady, isExecuting, isFinished, isCancelled). Поддерживается кооперативная отмена через метод cancel().
  3. Контроль параллелизма. Легко ограничить количество одновременно выполняемых операций в очереди.
    queue.maxConcurrentOperationCount = 2 // Не более 2 операций параллельно
  4. Приоритеты. Установка приоритета выполнения (queuePriority).
  5. Переиспользование и инкапсуляция. Сложную логику можно инкапсулировать в кастомный подкласс Operation.

Когда выбрать GCD (DispatchQueue):

  • Для простых асинхронных или отложенных задач.
  • Когда достаточно сериальных или параллельных очередей без сложных зависимостей.
  • Для низкоуровневой синхронизации (семафоры, барьеры).

NSOperationQueue часто реализован поверх GCD и предоставляет более удобный объектно-ориентированный API для сложных рабочих потоков.