Каков ваш опыт работы с NSOperation и NSOperationQueue?

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

Ответ

NSOperation — это абстрактный класс для инкапсуляции задач, работающий поверх GCD, но предоставляющий более высокоуровневый контроль.

Основные преимущества перед GCD:

  1. Зависимости между операциями:

    let downloadOp = BlockOperation { /* Загрузка */ }
    let parseOp = BlockOperation { /* Парсинг */ }
    let saveOp = BlockOperation { /* Сохранение */ }
    
    parseOp.addDependency(downloadOp)
    saveOp.addDependency(parseOp)
    
    let queue = OperationQueue()
    queue.addOperations([downloadOp, parseOp, saveOp], waitUntilFinished: false)
  2. Контроль состояния через KVO:

    • isReady — операция готова к выполнению
    • isExecuting — операция выполняется
    • isFinished — операция завершена
    • isCancelled — операция отменена
  3. Приоритеты операций:

    operation.queuePriority = .high
    operation.qualityOfService = .userInitiated
  4. Отмена операций:

    operation.cancel()
    // В кастомной операции:
    override func main() {
        guard !isCancelled else { return }
        // Выполнение работы
    }

Типы операций:

  • BlockOperation — для простых задач
  • Кастомные подклассы NSOperation — для сложной логики

Настройка очереди:

let queue = OperationQueue()
queue.maxConcurrentOperationCount = 3 // Ограничение параллелизма
queue.qualityOfService = .userInteractive
queue.name = "com.app.processingQueue"

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

  • Цепочки зависимых операций (загрузка → обработка → сохранение)
  • Управление параллелизмом в фоновых задачах
  • Операции с возможностью отмены и приостановки
  • Сложные задачи с отслеживанием состояния