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
isCancelledall'interno del blocco. - Un
DispatchWorkItemcancellato può essere messo in coda, ma il suo blocco non verrà eseguito seisCancelledviene verificato prima dell'inizio. - Chiamare
cancel()su unDispatchWorkItemgià eseguito o cancellato non ha effetto.
Proprietà:
| Proprietà | Tipo | Descrizione |
|---|---|---|
isCancelled |
Bool |
Restituisce true se il lavoro è stato cancellato. |