Sobes.tech
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 DispatchWorkItem anulat poate fi plasat în coadă, dar blocul său nu va fi executat dacă isCancelled este verificat înainte de începere.
  • Apelarea cancel() pe un DispatchWorkItem deja executat sau anulat nu are efect.

Proprietăți:

Proprietate Tip Descriere
isCancelled Bool Returnează true dacă lucrarea a fost anulată.