Middle
Papaskinkite apie atšaukimo mechanizmą DispatchWorkItem.
sobes.tech AI
Atsakymas iš AI
DispatchWorkItem yra kodo blokas, kurį galima suplanuoti vykdyti dispečerio eilėje, ir kurį galima atšaukti iki jo faktinio vykdymo.
Atšaukimas įgyvendinamas per DispatchWorkItem viduje esantį žymeklį. Atšaukimo mechanizmas yra kooperatyvus: DispatchWorkItem pats turi reguliariai tikrinti savo atšaukimo būseną.
Kviečiant cancel() metodą DispatchWorkItem, žymeklis nustatomas kaip atšauktas. Faktinis vykdymo nutraukimas įvyksta tik tada, kai kodo bloke atliekama šio žymeklio patikra naudojant isCancelled savybę.
Naudojimo pavyzdys:
let darbas: DispatchWorkItem = DispatchWorkItem {
for i in 0..<100 {
guard !savarankiškaiVykdomasObjektas.isCancelled else { // Atšaukimo žymeklio patikra
print("Operacija atšaukta iteracijoje \(i)")
return // Vykdymo pabaiga
}
// Naudingos darbo atlikimas
Thread.sleep(forTimeInterval: 0.1) // Ilgos operacijos imitacija
}
print("Operacija baigta")
}
DispatchQueue.global().async(execute: darbas)
// Atšaukti darbą po 1 sekundės
DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
darbas.cancel()
}
Pagrindiniai punktai:
- Nedelsiant atšaukimas nėra garantuotas; priklauso nuo
isCancelledpatikros dažnumo bloke. - Atšauktas
DispatchWorkItemgali būti įtrauktas į eilę, tačiau jo blokas nebus vykdomas, jeiisCancelledbus patikrintas prieš pradėdami vykdyti. cancel()iškvietimas jau įvykdytam ar atšauktamDispatchWorkItemneturi įtakos.
Savybės:
| Savybė | Tipas | Aprašymas |
|---|---|---|
isCancelled |
Bool |
Grąžina true, jei darbas atšauktas. |