Sobes.tech
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, ако работата е отменена.