Middle
Vorbește-mi despre mecanismul de anulare în DispatchWorkItem.
sobes.tech AI
Răspuns de la AI
DispatchWorkItem reprezintă un bloc de cod care poate fi programat pentru executare într-o coadă de dispatch și care poate fi anulat înainte de executarea sa efectivă.
Anularea se implementează printr-un steag în interiorul DispatchWorkItem. Mecanismul de anulare este cooperativ: DispatchWorkItem trebuie să verifice regulat starea sa de anulare.
Apelând metoda cancel() pe DispatchWorkItem, se setează steagul de anulare. Intervenția efectivă a execuției are loc doar dacă, în interiorul blocului de cod DispatchWorkItem, această verificare este efectuată folosind proprietatea isCancelled.
Exemplu de utilizare:
let sarcina: DispatchWorkItem = DispatchWorkItem {
for i in 0..<100 {
guard !self.isCancelled else { // Verificarea steagului de anulare
print("Operație anulată la iterația \(i)")
return // Încheierea execuției
}
// Executarea muncii utile
Thread.sleep(forTimeInterval: 0.1) // Simulare a unei operații lungi
}
print("Operație finalizată")
}
DispatchQueue.global().async(execute: sarcina)
// Anulează lucrarea după 1 secundă
DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
sarcina.cancel()
}
Puncte cheie:
- Anularea imediată nu este garantată; depinde de frecvența cu care se verifică
isCancelledîn interiorul blocului. - Un
DispatchWorkItemanulat poate fi plasat în coadă, dar blocul său nu va fi executat dacăisCancelledeste verificat înainte de începere. - Apelarea
cancel()pe unDispatchWorkItemdeja executat sau anulat nu are efect.
Proprietăți:
| Proprietate | Tip | Descriere |
|---|---|---|
isCancelled |
Bool |
Returnează true dacă lucrarea a fost anulată. |