Middle
Parlez-moi du mécanisme d'annulation dans DispatchWorkItem.
sobes.tech IA
Réponse de l'IA
DispatchWorkItem représente un bloc de code pouvant être planifié pour s'exécuter dans une file d'attente de dispatch, et qui peut être annulé avant son exécution réelle.
L'annulation est implémentée via un drapeau à l'intérieur de DispatchWorkItem. Le mécanisme d'annulation est coopératif : DispatchWorkItem doit vérifier régulièrement son statut d'annulation.
En appelant la méthode cancel() sur DispatchWorkItem, le drapeau d'annulation est défini. La véritable interruption de l'exécution ne se produit que si, à l'intérieur du bloc de code de DispatchWorkItem, cette vérification est effectuée à l'aide de la propriété isCancelled.
Exemple d'utilisation :
let tâche: DispatchWorkItem = DispatchWorkItem {
for i in 0..<100 {
guard !self.isCancelled else { // Vérification du drapeau d'annulation
print("Opération annulée à l'itération \(i)")
return // Fin de l'exécution
}
// Effectuer un travail utile
Thread.sleep(forTimeInterval: 0.1) // Simulation d'une opération longue
}
print("Opération terminée")
}
DispatchQueue.global().async(execute: tâche)
// Annuler le travail après 1 seconde
DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
tâche.cancel()
}
Points clés :
- L'annulation immédiate n'est pas garantie ; cela dépend de la fréquence à laquelle
isCancelledest vérifié à l'intérieur du bloc. - Un
DispatchWorkItemannulé peut être mis en file d'attente, mais son bloc ne sera pas exécuté siisCancelledest vérifié avant le début. - Appeler
cancel()sur unDispatchWorkItemdéjà exécuté ou annulé n'a pas d'effet.
Propriétés :
| Propriété | Type | Description |
|---|---|---|
isCancelled |
Bool |
Renvoie true si le travail est annulé. |