Ответ
Метод cancel() не прерывает выполнение операции напрямую. Он выполняет кооперативную отмену, устанавливая свойство isCancelled в true и отправляя KVO-уведомления.
Как это работает:
- Вызов
cancel()меняет только внутреннее состояние операции. - Сама операция должна периодически проверять
isCancelledи корректно завершать свою работу. - Операция остается в очереди (
OperationQueue) до тех пор, пока не перейдет в состояниеisFinished = true.
Пример реализации в кастомной Operation:
class LongRunningOperation: Operation {
override func main() {
// 1. Проверка на отмену перед началом работы
guard !isCancelled else { return }
// 2. Длительная задача с периодическими проверками
for item in largeArray {
// Критически важная проверка в цикле
if isCancelled {
// Очистка ресурсов, если необходимо
return
}
process(item)
}
}
}
Важные нюансы:
- Асинхронные операции: Отмена сложнее, необходимо также отменять все внутренние асинхронные задачи (например,
URLSessionDataTask). - Состояния KVO: Флаги
isExecutingиisFinishedдолжны меняться разработчиком с отправкой корректных KVO-уведомлений. - Немедленный выход: После проверки
isCancelledоперация должна как можно быстрее завершитьmain()и перейти в состояниеisFinished.