Sobes.tech
Middle

Parla del meccanismo di cancellazione in DispatchWorkItem.

sobes.tech AI

Risposta dell'AI

DispatchWorkItem rappresenta un blocco di codice che può essere pianificato per l'esecuzione in una coda di dispatch, e che può essere annullato prima della sua esecuzione effettiva.

La cancellazione viene implementata tramite una bandiera all'interno di DispatchWorkItem. Il meccanismo di cancellazione è cooperativo: DispatchWorkItem deve verificare regolarmente il suo stato di cancellazione.

Chiamando il metodo cancel() su DispatchWorkItem, si imposta la bandiera di cancellazione. La vera interruzione dell'esecuzione avviene solo se, all'interno del blocco di codice di DispatchWorkItem, questa verifica viene effettuata usando la proprietà isCancelled.

Esempio di utilizzo:

let compito: DispatchWorkItem = DispatchWorkItem {
    for i in 0..<100 {
        guard !self.isCancelled else { // Verifica della bandiera di cancellazione
            print("Operazione annullata all'iterazione \(i)")
            return // Fine dell'esecuzione
        }
        // Eseguire lavoro utile
        Thread.sleep(forTimeInterval: 0.1) // Simulazione di un'operazione lunga
    }
    print("Operazione completata")
}

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

// Annulla il lavoro dopo 1 secondo
DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
    compito.cancel()
}

Punti chiave:

  • La cancellazione immediata non è garantita; dipende dalla frequenza con cui si verifica isCancelled all'interno del blocco.
  • Un DispatchWorkItem cancellato può essere messo in coda, ma il suo blocco non verrà eseguito se isCancelled viene verificato prima dell'inizio.
  • Chiamare cancel() su un DispatchWorkItem già eseguito o cancellato non ha effetto.

Proprietà:

Proprietà Tipo Descrizione
isCancelled Bool Restituisce true se il lavoro è stato cancellato.