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:
-
Cancellable-Protokoll: Definiert die Anforderung, die Methodecancel()zu haben, die den Abbruch initiiert.// Protokoll-Definition public protocol Cancellable { func cancel() } -
AnyCancellable: Wrapper-Typ, der jeden Typ speichert, derCancellableentspricht, undcancel()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 -
Abbruch in Combine: Im Combine-Framework bieten die meisten Publisher eine Subscription (
Subscription), dieCancellableimplementiert. Bei Aufruf voncancel()aufSubscriptionwird der Datenstrom gestoppt. Normalerweise wirdSubscriptioninAnyCancellableeingewickelt 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 } -
OperationundOperationQueue: In älteren APIs gibt es ebenfalls einen Abbruchmechanismus. Die KlasseOperationhat die Methodecancel()und die EigenschaftisCancelled.OperationQueueprü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.