Sobes.tech
Middle

Mesélj a DispatchWorkItem törlés mechanizmusáról.

sobes.tech MI

Válasz az MI-től

A DispatchWorkItem egy kódrészletet képvisel, amelyet ütemezhetünk végrehajtásra egy dispatch sorban, és amelyet a tényleges végrehajtás előtt le lehet állítani.

A leállítás egy zászló segítségével történik a DispatchWorkItem-en belül. A leállítás mechanizmusa kooperatív: a DispatchWorkItem-nek rendszeresen ellenőriznie kell a leállítási állapotát.

A cancel() metódus hívásakor a leállítási zászló beállításra kerül. A tényleges megszakítás csak akkor történik meg, ha a DispatchWorkItem kódblokkja belsejében ezt a zászlót a isCancelled tulajdonság segítségével ellenőrzik.

Használati példa:

let feladat: DispatchWorkItem = DispatchWorkItem {
    for i in 0..<100 {
        guard !self.isCancelled else { // Leállítási zászló ellenőrzése
            print("Művelet megszakítva a \(i) iterációnál")
            return // Befejezés
        }
        // Hasznos munka végrehajtása
        Thread.sleep(forTimeInterval: 0.1) // Hosszú művelet szimulálása
    }
    print("Művelet befejeződött")
}

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

// Munka leállítása 1 másodperc után
DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
    feladat.cancel()
}

Fő pontok:

  • Az azonnali leállítás nem garantált; attól függ, milyen gyakran ellenőrzi a isCancelled-t a blokk belsejében.
  • Egy leállított DispatchWorkItem beállítható a sorba, de a blokk nem fog végrehajtódni, ha a isCancelled ellenőrzése előtt kezdődött.
  • A cancel() hívása már végrehajtott vagy leállított DispatchWorkItem-en nem hatékony.

Tulajdonságok:

Tulajdonság Típus Leírás
isCancelled Bool Visszaadja, hogy a munka leállt-e.