Вопрос проверяет умение контролировать исполнение асинхронных задач в Grand Central Dispatch и отменять их при необходимости.
GCD по умолчанию не поддерживает отмену обычных async задач, но можно использовать DispatchWorkItem — он позволяет вызвать метод cancel(), а в самом блоке проверять isCancelled и досрочно выходить.
Создание DispatchWorkItem:
let workItem = DispatchWorkItem {
for i in 0..<100 {
guard !workItem.isCancelled else { return }
// тяжёлая работа
}
}
DispatchQueue.global().async(execute: workItem)Отмена:
workItem.cancel()Проверка внутри блока:
isCancelled будет true, если вызван cancel().
Нужно периодически проверять, чтобы избежать лишней работы.
Ограничения:
Если блок уже начал выполняться и не проверяет isCancelled, его не остановить.
Нет гарантий мгновенной отмены.
Вывод:
Для контролируемой отмены задач в GCD используйте DispatchWorkItem и проверку isCancelled внутри блока. Это даёт гибкость управления, но требует явной поддержки внутри кода.