Что делает метод cancel() в многозадачности iOS?

«Что делает метод cancel() в многозадачности iOS?» — вопрос из категории Многопоточность, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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 Отменяет выполнение, если ещё не началось

Общее правило: Отмена не гарантирует мгновенную остановку, но предотвращает дальнейшую бесполезную работу и освобождает ресурсы.