Ответ
Способ отмены зависит от используемой очереди.
1. Отмена в OperationQueue (наиболее надёжная)
Operation и OperationQueue предоставляют встроенную поддержку отмены.
// Создаём операцию
let operation = BlockOperation {
// Регулярно проверяем флаг отмены
while !operation.isCancelled {
// Выполняем работу
}
}
let queue = OperationQueue()
queue.addOperation(operation)
// Для отмены:
operation.cancel() // Отменяет одну операцию
// или
queue.cancelAllOperations() // Отменяет все операции в очереди
2. Отмена в GCD с использованием DispatchWorkItem
DispatchWorkItem поддерживает отмену, но это кооперативная (cooperative) отмена.
// Создаём WorkItem
let workItem = DispatchWorkItem {
// Нужно вручную проверять статус
if !workItem.isCancelled {
performTask()
}
}
// Ставим в очередь
DispatchQueue.global().async(execute: workItem)
// Для отмены:
workItem.cancel()
| Важные различия: | Особенность | OperationQueue | DispatchWorkItem (GCD) |
|---|---|---|---|
| Отмена выполняющейся задачи | Да (через проверку isCancelled внутри задачи) |
Нет (отмена только для задач, ещё не начавших выполнение) | |
| Приоритеты и зависимости | Есть | Нет | |
| Простота | Сложнее | Проще |
Рекомендация: Для сложных задач, требующих отмены, приостановки или зависимостей, используйте OperationQueue. Для простых асинхронных задач подойдёт GCD.