Middle
Vertel me over het annuleringsmechanisme in DispatchWorkItem.
sobes.tech AI
Antwoord van AI
DispatchWorkItem vertegenwoordigt een codeblok dat gepland kan worden voor uitvoering in een dispatchwachtrij, en dat kan worden geannuleerd voordat het daadwerkelijk wordt uitgevoerd.
De annulering wordt geïmplementeerd via een vlag binnen DispatchWorkItem. Het annuleringsmechanisme is coöperatief: DispatchWorkItem moet regelmatig zijn annuleringsstatus controleren.
Door de methode cancel() aan te roepen op DispatchWorkItem, wordt de annuleringsvlag ingesteld. De daadwerkelijke onderbreking van de uitvoering gebeurt alleen als binnen het codeblok van DispatchWorkItem deze vlag wordt gecontroleerd met behulp van de eigenschap isCancelled.
Voorbeeld van gebruik:
let taak: DispatchWorkItem = DispatchWorkItem {
for i in 0..<100 {
guard !self.isCancelled else { // Controleer de annuleringsvlag
print("Operatie geannuleerd bij iteratie \(i)")
return // Beëindig de uitvoering
}
// Voer nuttig werk uit
Thread.sleep(forTimeInterval: 0.1) // Simulatie van een lange operatie
}
print("Operatie voltooid")
}
DispatchQueue.global().async(execute: taak)
// Annuleer de taak na 1 seconde
DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
taak.cancel()
}
Belangrijke punten:
- Onmiddellijke annulering wordt niet gegarandeerd; dit hangt af van hoe vaak
isCancelledwordt gecontroleerd binnen het blok. - Een geannuleerde
DispatchWorkItemkan in de wachtrij worden geplaatst, maar het blok wordt niet uitgevoerd alsisCancelledwordt gecontroleerd vóór de start. - Het aanroepen van
cancel()op een al uitgevoerde of geannuleerdeDispatchWorkItemheeft geen effect.
Eigenschappen:
| Eigenschap | Type | Beschrijving |
|---|---|---|
isCancelled |
Bool |
Geeft true terug als het werk is geannuleerd. |