Как отменить уже поставленную в очередь задачу в iOS?

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

Ответ

Способ отмены зависит от используемой очереди.

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.