Sobes.tech
Middle

Pastāstiet man par atcelšanas mehānismu DispatchWorkItem.

sobes.tech AI

Atbilde no AI

DispatchWorkItem irr ir kodu bloks, ko var plānot izpildi darbus dispečera rindā, un to var atcelt pirms tā faktiskas izpildes.

Atcelšana tiek īstenota caur DispatchWorkItem iekšējo zīmi. Atcelšanas mehānisms ir kooperatīvs: DispatchWorkItem pats regulāri pārbauda savu atcelšanas statusu.

Izsaucot cancel() metodi DispatchWorkItem, zīme tiek iestatīta kā atcelta. Faktiska izpildes pārtraukšana notiek tikai tad, ja kodā tiek veikta šīs zīmes pārbaude ar isCancelled īpašību.

Piemērs lietošanai:

let darbs: DispatchWorkItem = DispatchWorkItem {
    for i in 0..<100 {
        guard !saviem spēkiemVykdomaObjekts.isCancelled else { // Atcelšanas zīmes pārbaude
            print("Operācija atcelta iterācijā \(i)")
            return // Izpildes pabeigšana
        }
        // Noderīga darba izpilde
        Thread.sleep(forTimeInterval: 0.1) // Ilgas operācijas imitācija
    }
    print("Operācija pabeigta")
}

DispatchQueue.global().async(execute: darbs)

// Darba atcelšana pēc 1 sekundes
DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
    darbs.cancel()
}

Galvenie punkti:

  • Nekavējoša atcelšana nav garantēta; atkarīga no isCancelled pārbaudes biežuma blokā.
  • Atcelts DispatchWorkItem var tikt ievietots rindā, bet tā bloks netiks izpildīts, ja isCancelled tiks pārbaudīts pirms izpildes sākuma.
  • cancel() izsaukšana jau izpildītam vai atceltiem DispatchWorkItem nav efektīva.

Īpašības:

Īpašība Tips Apraksts
isCancelled Bool Atgriež true, ja darbs ir atcelts.