Sobes.tech
Middle

Wie kann man die Ausführung synchroner Aufgaben in iOS abbrechen?

sobes.tech KI

Antwort von AI

Es gibt keine direkte Stornierung von synchronen Aufgaben (die den aktuellen Thread blockieren), ohne die Ausführung des Threads zu unterbrechen.

Um eine synchrone Aufgabe zu simulieren, die abgebrochen werden kann, können folgende Ansätze verwendet werden:

  1. Regelmäßige Überprüfung einer Abbruch-Flagge: Fügen Sie in die Logik der synchronen Aufgabe eine Überprüfung einer booleschen Flagge ein, die extern gesetzt wird, wenn eine Abbruch erforderlich ist. Wenn die Flagge gesetzt ist, beendet sich die Aufgabe vorzeitig.

    var isCancelled = false
    
    func performSynchronousTask() {
        // Beginn der Aufgabe
        for i in 0..<100000 {
            if isCancelled {
                print("Aufgabe abgebrochen")
                return // Vorzeitiger Austritt
            }
            // Ausführung eines Teils der Arbeit
            // ... lange Berechnungen oder Operationen
        }
        print("Aufgabe abgeschlossen")
    }
    
    func cancelTask() {
        isCancelled = true
    }
    
    // Beispiel für die Verwendung
    // performSynchronousTask() // Synchrone Aufruf
    // cancelTask() // Von einem anderen Thread aufrufen, um abzubrechen
    
  2. Verwendung von try? Task.checkCancellation() in einem asynchronen Kontext: Wenn die synchrone Aufgabe innerhalb eines Task im asynchronen Swift Concurrency-Kontext ausgeführt wird, kann try? Task.checkCancellation() regelmäßig aufgerufen werden. Bei Abbruch löst dieser Aufruf eine CancellationError aus.

    func performCancellableSynchronousWork() throws {
        for i in 0..<100000 {
            try Task.checkCancellation() // Abbruchprüfung
            // Ausführung eines Teils der Arbeit
            // ...
        }
    }
    
    // Beispiel für die Verwendung im asynchronen Kontext
    /*
    let task = Task {
        do {
            try performCancellableSynchronousWork()
            print("Aufgabe abgeschlossen")
        } catch is CancellationError {
            print("Aufgabe abgebrochen")
        } catch {
            print("Ein Fehler ist aufgetreten: \(error)")
        }
    }
    
    // Zum Abbrechen der Aufgabe
    // task.cancel()
    */