Sobes.tech
Middle

Pověz mi o mechanismu zrušení v DispatchWorkItem.

sobes.tech AI

Odpověď od AI

DispatchWorkItem představuje blok kódu, který lze naplánovat k provedení ve frontě dispatch, a který lze zrušit před jeho skutečným provedením.

Zrušení je implementováno pomocí vlajky uvnitř DispatchWorkItem. Mechanismus zrušení je kooperativní: DispatchWorkItem musí pravidelně kontrolovat svůj stav zrušení.

Voláním metody cancel() u DispatchWorkItem se nastaví vlajka zrušení. Skutečné přerušení provádění nastává pouze tehdy, pokud je tato vlajka v rámci bloku kódu DispatchWorkItem kontrolována pomocí vlastnosti isCancelled.

Příklad použití:

let úkol: DispatchWorkItem = DispatchWorkItem {
    for i in 0..<100 {
        guard !self.isCancelled else { // Kontrola vlajky zrušení
            print("Operace zrušena při iteraci \(i)")
            return // Ukončení provádění
        }
        // Provádění užitečné práce
        Thread.sleep(forTimeInterval: 0.1) // Simulace dlouhé operace
    }
    print("Operace dokončena")
}

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

// Zrušit práci po 1 sekundě
DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
    úkol.cancel()
}

Hlavní body:

  • Okamžité zrušení není garantováno; záleží na frekvenci kontroly isCancelled uvnitř bloku.
  • Zrušený DispatchWorkItem může být zařazen do fronty, ale jeho blok nebude vykonán, pokud je isCancelled zkontrolováno před začátkem.
  • Volání cancel() na již provedeném nebo zrušeném DispatchWorkItem nemá efekt.

Vlastnosti:

Vlastnost Typ Popis
isCancelled Bool Vrací true, pokud práce byla zrušena.