Ответ
cancel() — метод для отмены выполнения асинхронной задачи до её завершения. Реализация и поведение различаются в зависимости от API.
Operation
class MyOperation: Operation {
override func main() {
// Регулярно проверяем флаг отмены
for item in largeCollection {
guard !isCancelled else {
print("Операция отменена")
return
}
// Обработка item
}
}
}
let operation = MyOperation()
operationQueue.addOperation(operation)
// ...
operation.cancel() // Устанавливает isCancelled = true
Важно: cancel() только устанавливает флаг isCancelled. Сама операция должна регулярно проверять этот флаг и корректно завершаться.
URLSessionTask
let task = URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error as? URLError, error.code == .cancelled {
print("Запрос отменён")
}
}
task.resume()
// ...
task.cancel() // Немедленно прерывает сетевой запрос
Отличия
| API | Поведение при cancel() |
|---|---|
| Operation | Устанавливает флаг isCancelled. Требует ручной проверки в коде операции |
| URLSessionTask | Немедленно прерывает сетевой запрос, освобождает ресурсы |
| DispatchWorkItem | Отменяет выполнение, если ещё не началось |
Общее правило: Отмена не гарантирует мгновенную остановку, но предотвращает дальнейшую бесполезную работу и освобождает ресурсы.