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
DispatchWorkItembeállítható a sorba, de a blokk nem fog végrehajtódni, ha aisCancelledellenőrzése előtt kezdődött. - A
cancel()hívása már végrehajtott vagy leállítottDispatchWorkItem-en nem hatékony.
Tulajdonságok:
| Tulajdonság | Típus | Leírás |
|---|---|---|
isCancelled |
Bool |
Visszaadja, hogy a munka leállt-e. |