Middle
Разкажи ми за механизма за анулиране в DispatchWorkItem.
sobes.tech AI
Отговор от AI
DispatchWorkItem представлява блок от код, който може да бъде планиран за изпълнение в опашка за разпределение и който може да бъде отменен преди неговото фактическо изпълнение.
Отмяната се реализира чрез флаг вътре в DispatchWorkItem. Механизмът за отмяна е кооперативен: DispatchWorkItem трябва редовно да проверява състоянието си на отмяна.
Когато се извика методът cancel() върху DispatchWorkItem, се задава флагът за отмяна. Фактическото прекъсване на изпълнението се случва само ако вътре в блока код на DispatchWorkItem този флаг бъде проверен чрез свойството isCancelled.
Пример за използване:
let задача: DispatchWorkItem = DispatchWorkItem {
for i in 0..<100 {
guard !self.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, ако работата е отменена. |