Sobes.tech
Middle

Erzählen Sie mir vom Stornierungsmechanismus bei Transaktionen.

sobes.tech KI

Antwort von AI

Der Abbruchmechanismus für Operationen in iOS basiert auf der Verwendung des Protokolls Cancellable und verwandter Typen.

Hauptkomponenten:

  1. Cancellable-Protokoll: Definiert die Anforderung, die Methode cancel() zu haben, die den Abbruch initiiert.

    // Protokoll-Definition
    public protocol Cancellable {
        func cancel()
    }
    
  2. AnyCancellable: Wrapper-Typ, der jeden Typ speichert, der Cancellable entspricht, und cancel() automatisch beim Deinitialisieren aufruft. Nützlich zur Verwaltung des Lebenszyklus von Abonnements/Operationen.

    // Beispiel
    var cancellable = AnyCancellable {
        // Abbruchaktion
        print("Operation abgebrochen")
    }
    
    // Innerhalb des Geltungsbereichs, wo `cancellable` definiert ist, wird beim Verlassen `cancel()` aufgerufen
    
  3. Abbruch in Combine: Im Combine-Framework bieten die meisten Publisher eine Subscription (Subscription), die Cancellable implementiert. Bei Aufruf von cancel() auf Subscription wird der Datenstrom gestoppt. Normalerweise wird Subscription in AnyCancellable eingewickelt und gespeichert.

    // Beispiel in Combine
    import Combine
    
    let publisher = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
    var cancellable: AnyCancellable? = publisher.sink { completion in
        print("Abschluss: \(completion)")
    } receiveValue: { date in
        print("Wert: \(date)")
    }
    
    // Nach einiger Zeit abbrechen
    DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
        cancellable?.cancel() // Aufruf von `cancel()` auf `AnyCancellable`
        cancellable = nil // Referenz löschen
    }
    
  4. Operation und OperationQueue: In älteren APIs gibt es ebenfalls einen Abbruchmechanismus. Die Klasse Operation hat die Methode cancel() und die Eigenschaft isCancelled. OperationQueue prüft diese Eigenschaft und plant keine abgebrochenen Operationen.

    import Foundation
    
    class MyOperation: Operation {
        override func main() {
            if isCancelled { // Abbruchstatus prüfen
                print("Operation vor Beginn abgebrochen")
                return
            }
    
            // Aufgabe ausführen
            for i in 0..<1000 {
                if isCancelled { // Abbruchstatus während der Aufgabe prüfen
                    print("Operation während der Ausführung abgebrochen")
                    return
                }
                // Schwerarbeit oder API-Aufruf
                print("Schritt \(i)")
            }
    
            print("Operation beendet")
        }
    }
    
    let queue = OperationQueue()
    let operation = MyOperation()
    
    queue.addOperation(operation)
    
    // Operation nach einiger Zeit abbrechen
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
       operation.cancel() // Aufruf von `cancel()`
    }
    
    // Warten auf Abschluss (nicht im Hauptthread empfehlen)
    // queue.waitUntilAllOperationsAreFinished()
    

Der Abbruchmechanismus in iOS ist asynchron und kooperativ. Der Aufruf cancel() signalisiert die Absicht, die Operation/den Datenstrom abzubrechen, aber das tatsächliche Stoppen hängt davon ab, wie die Operation dieses Signal verarbeitet (z.B. durch Überprüfung von isCancelled oder Reaktion auf Abbruch der Subscription).

Die Verwaltung abbruchfähiger Objekte (insbesondere AnyCancellable) erfolgt häufig durch deren Speicherung in Sammlungen (Set<AnyCancellable>) oder Objekt-Eigenschaften, um sicherzustellen, dass cancel() beim Destruktor des Containers oder bei explizitem Entfernen aus der Sammlung aufgerufen wird.