Как отменить уже поставленную в очередь задачу в 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.

Ответ 18+ 🔞

А, ну вот, опять про эти ваши очереди, блядь! Сидишь, думаешь, как бы асинхронно что-то сделать, а потом — бац! — надо всё отменить, потому что пользователь ткнул куда-то не туда или просто передумал. Так, слушай сюда, сейчас разжую, как это работает, а то у тебя там, вижу, уже глаза стекленеют.

1. OperationQueue — это наш бронепоезд, ёпта!

Тут всё по-взрослому, с проверками и контролем. Operation — это как задание для солдата, а OperationQueue — сержант, который кричит «Отставить!».

// Создаём операцию — это наш солдат с заданием
let operation = BlockOperation {
    // Солдат должен постоянно оглядываться, не отозвали ли его
    while !operation.isCancelled {
        // ...тут он делает свою работу, копает траншею, например
    }
}

let queue = OperationQueue() // Сержант пришёл
queue.addOperation(operation) // Солдат, вперёд!

// А потом бац — команда «Отставить!»
operation.cancel() // Этому конкретному солдату
// или
queue.cancelAllOperations() // Всему взводу! Разойтись, сука!

Суть в чём? Солдат сам должен проверять флаг isCancelled. Если не проверит — будет копать, пока сержант ему по башке не даст. Кооперативная отмена, блядь. Без мозгов — на хуй.

2. GCD с DispatchWorkItem — это как попросить кота сходить за хлебом

Вроде и проще, но ненадёжнее, пиздец. DispatchWorkItem — это такая бумажка с поручением. Ты её отдал — и всё, процесс пошёл.

// Пишем поручение на бумажке
let workItem = DispatchWorkItem {
    // А перед выполнением надо глянуть, не порвали ли бумажку
    if !workItem.isCancelled {
        performTask() // Идём за хлебом
    }
}

// Кричим коту: «Эй, пушистый, выполни!»
DispatchQueue.global().async(execute: workItem)

// Потом передумываем: «Стой, нахуй не надо!»
workItem.cancel()

Но вот в чём, сука, подвох: если кот уже побежал за хлебом, кричи не кричи «Отмена!» — он тебя не услышит. Отмена в GCD работает только для тех котов, которые ещё сидят на диване и не начали выполнять поручение. Уже бегущего кота не остановить, ебать его в сраку.

Так что же выбрать? Сравнительная таблица, блядь!

Особенность OperationQueue DispatchWorkItem (GCD)
Можно ли отменить задачу, которая уже выполняется? Да, но только если она сама проверяет isCancelled Нихуя! Только если она ещё в очереди стоит
Есть ли приоритеты и зависимости? Есть, можно строить целые цепочки Нет, тут всё в одну кучу
Сложность Немного замороченнее Попроще, для быстрых дел

Итог, Колян: Если тебе нужна серьёзная, управляемая работа с возможностью реальной отмены, приостановки и чтобы одна задача ждала другую — твой выбор OperationQueue. Это как танк: надёжно, но нужно уметь водить.

Если же задача простая, одноразовая, и тебе похуй, что её нельзя будет остановить на полпути — бери GCD с DispatchWorkItem. Быстро и сердито.

Вот и вся философия, блядь. Выбирай с умом, а то потом будешь как тот Герасим — метаться и орать «Муму!», а собаку уже не вернёшь.