Ответ
NSOperation — это абстрактный класс для инкапсуляции задач, работающий поверх GCD, но предоставляющий более высокоуровневый контроль.
Основные преимущества перед GCD:
-
Зависимости между операциями:
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) -
Контроль состояния через KVO:
isReady— операция готова к выполнениюisExecuting— операция выполняетсяisFinished— операция завершенаisCancelled— операция отменена
-
Приоритеты операций:
operation.queuePriority = .high operation.qualityOfService = .userInitiated -
Отмена операций:
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"
Практическое применение:
- Цепочки зависимых операций (загрузка → обработка → сохранение)
- Управление параллелизмом в фоновых задачах
- Операции с возможностью отмены и приостановки
- Сложные задачи с отслеживанием состояния