Sobes.tech
Middle

Comment annuler l'exécution des tâches synchrones dans iOS?

sobes.tech IA

Réponse de l'IA

Il n'y a pas d'annulation directe des tâches synchrones (qui bloquent le thread actuel) sans interrompre l'exécution du thread.

Pour simuler l'annulation d'une tâche synchrone, vous pouvez utiliser les approches suivantes :

  1. Vérification régulière d'un drapeau d'annulation : Ajoutez dans la logique de la tâche synchrone une vérification d'un drapeau booléen, qui est défini de l'extérieur lorsque l'annulation est nécessaire. Si le drapeau est défini, la tâche se termine prématurément.

    var isCancelled = false
    
    func performSynchronousTask() {
        // Début de la tâche
        for i in 0..<100000 {
            if isCancelled {
                print("Tâche annulée")
                return // Sortie anticipée
            }
            // Exécution d'une partie du travail
            // ... calculs longs ou opérations
        }
        print("Tâche terminée")
    }
    
    func cancelTask() {
        isCancelled = true
    }
    
    // Exemple d'utilisation
    // performSynchronousTask() // Appel synchrone
    // cancelTask() // Appeler depuis un autre thread pour annuler
    
  2. Utilisation de try? Task.checkCancellation() dans un contexte asynchrone : Si la tâche synchrone s'exécute dans un Task en contexte asynchrone de Swift Concurrency, vous pouvez l'appeler périodiquement. Si la tâche est annulée, cette appel lancera une CancellationError.

    func performCancellableSynchronousWork() throws {
        for i in 0..<100000 {
            try Task.checkCancellation() // Vérification de l'annulation
            // Exécution d'une partie du travail
            // ...
        }
    }
    
    // Exemple d'utilisation dans un contexte asynchrone
    /*
    let task = Task {
        do {
            try performCancellableSynchronousWork()
            print("Tâche terminée")
        } catch is CancellationError {
            print("Tâche annulée")
        } catch {
            print("Une erreur est survenue : \(error)")
        }
    }
    
    // Pour annuler la tâche
    // task.cancel()
    */