Sobes.tech
Middle

Povedz mi o mechanizme zrušenia v DispatchWorkItem.

sobes.tech AI

Odpoveď od AI

DispatchWorkItem predstavuje blok kódu, ktorý možno naplánovať na vykonanie vo fronte dispatch a ktorý možno zrušiť pred jeho skutočným vykonaním.

Zrušenie je implementované pomocou vlajky vo vnútri DispatchWorkItem. Mechanizmus zrušenia je kooperatívny: DispatchWorkItem musí pravidelne kontrolovať svoj stav zrušenia.

Volaním metódy cancel() na DispatchWorkItem sa nastaví vlajka zrušenia. Skutočné prerušenie vykonávania nastáva iba v prípade, ak je táto vlajka v rámci bloku kódu DispatchWorkItem kontrolovaná pomocou vlastnosti isCancelled.

Príklad použitia:

let úloha: DispatchWorkItem = DispatchWorkItem {
    for i in 0..<100 {
        guard !self.isCancelled else { // Kontrola vlajky zrušenia
            print("Operácia zrušená pri iterácii \(i)")
            return // Ukončenie vykonávania
        }
        // Vykonanie užitočnej práce
        Thread.sleep(forTimeInterval: 0.1) // Simulácia dlhého procesu
    }
    print("Operácia dokončená")
}

DispatchQueue.global().async(execute: úloha)

// Zrušiť prácu po 1 sekunde
DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
    úloha.cancel()
}

Hlavné body:

  • Okamžité zrušenie nie je garantované; závisí od frekvencie kontroly isCancelled v bloku.
  • Zrušený DispatchWorkItem môže byť vložený do fronty, ale jeho blok nebude vykonaný, ak je isCancelled skontrolované pred začatím.
  • Volanie cancel() na už vykonanom alebo zrušenom DispatchWorkItem nemá efekt.

Vlastnosti:

Vlastnosť Typ Popis
isCancelled Bool Vráti true, ak bola práca zrušená.