Назад к вопросам
Middle
138
questionbank
Расскажи о механизме отмены в DispatchWorkItem.
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
DispatchWorkItem представляет собой блок кода, который можно спланировать для выполнения в очереди диспетчеризации, и при этом его можно отменить до его фактического выполнения.
Отмена реализована через флаг внутри DispatchWorkItem. Механизм отмены коопративный: DispatchWorkItem сам должен регулярно проверять свой статус отмены.
При вызове метода cancel() у DispatchWorkItem, устанавливается флаг отмены. Фактическое прерывание выполнения происходит только в том случае, если внутри блока кода DispatchWorkItem выполняется проверка этого флага с помощью свойства isCancelled.
Пример использования:
let 작업: DispatchWorkItem = DispatchWorkItem {
for i in 0..<100 {
guard !самостоятельноВыполняемыйОбъект.isCancelled else { // Проверка флага отмены
print("Операция отменена на итерации \(i)")
return // Завершение выполнения
}
// Выполнение полезной работы
Thread.sleep(forTimeInterval: 0.1) // Имитация долгой операции
}
print("Операция завершена")
}
DispatchQueue.global().async(execute: 작업)
// Отменяем работу через 1 секунду
DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
задача.cancel()
}
Ключевые моменты:
- Немедленная отмена не гарантируется; зависит от частоты проверки
isCancelledвнутри блока. - Отмененный
DispatchWorkItemможет быть поставлен в очередь, но его блок не будет выполнен, еслиisCancelledбудет проверен до начала выполнения. - Вызов
cancel()на уже выполненном или отмененномDispatchWorkItemне имеет эффекта.
Свойства:
| Свойство | Тип | Описание |
|---|---|---|
isCancelled |
Bool |
Возвращает true, если работа отменена. |