Sobes.tech
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 isCancelled est vérifié à l'intérieur du bloc.
  • Un DispatchWorkItem annulé peut être mis en file d'attente, mais son bloc ne sera pas exécuté si isCancelled est vérifié avant le début.
  • Appeler cancel() sur un DispatchWorkItem dé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é.