Was ist Combine und warum wird es benötigt?
\nCombine ist ein Apple-Framework für reaktive Programmierung, das 2019 zusammen mit iOS 13 vorgestellt wurde. Es bietet eine deklarative Swift-API zur Verarbeitung von Ereignissen im Zeitverlauf. Combine ermöglicht es, Operatoren zur Verarbeitung asynchroner Ereignisse zu Datenverarbeitungsketten (Pipelines) zu kombinieren.
\nDie Hauptaufgabe von Combine besteht darin, die Arbeit mit asynchronen Operationen zu vereinfachen: Netzwerkanfragen, Benachrichtigungen, KVO (Key-Value Observing), Timer, Delegaten und Callback-Funktionen. Anstelle verschiedener Mechanismen bietet Combine eine einheitliche Schnittstelle auf Basis von Publisher und Subscriber.
\nSchlüsselkonzepte:
\n- \n
- Publisher — eine Datenquelle, die Werte senden und abschließen kann (erfolgreich oder mit Fehler). \n
- Subscriber — ein Datenempfänger, der auf Ereignisse des Publishers reagiert. \n
- Operator — eine Methode, die Datenströme transformiert, filtert oder kombiniert. \n
- Subscription — die Verbindung zwischen Publisher und Subscriber, die den Datenfluss steuert. \n
Combine ist eng mit SwiftUI und Foundation integriert, was es für moderne iOS-Apps unverzichtbar macht.
\n\nInstallation
\nCombine ist ein integriertes Apple-Framework. Für die Nutzung müssen keine zusätzlichen Pakete über CocoaPods, SPM oder Carthage installiert werden. Es ist ab iOS 13, macOS 10.15, tvOS 13 und watchOS 6 verfügbar.
\nUm Combine zu verwenden, reicht es aus, es in einer Swift-Datei zu importieren:
\nimport Combine\nWenn Sie den Swift Package Manager zur Verwaltung von Abhängigkeiten verwenden, ist Combine bereits in der Standardbibliothek enthalten. Für Projekte, die ältere Betriebssystemversionen unterstützen, kann OpenCombine verwendet werden – eine Open-Source-Implementierung von Combine.
\nInstallation von OpenCombine über SPM:
\n// In Package.swift\ndependencies: [\n .package(url: "https://github.com/CombineOpenSource/Combine.git", from: "0.5.0")\n]\n\nSchnellstart mit Codebeispiel
\nBetrachten wir ein einfaches Beispiel: Erstellen eines Publishers aus einem Array und Abonnieren desselben.
\nimport Combine\n\n// 1. Publisher aus einem Array erstellen\nlet publisher = [1, 2, 3, 4, 5].publisher\n\n// 2. Subscriber erstellen\nlet subscriber = Subscribers.Sink<Int, Never>(\n receiveCompletion: { completion in\n print("Abgeschlossen: \\(completion)")\n },\n receiveValue: { value in\n print("Wert erhalten: \\(value)")\n }\n)\n\n// 3. Abonnieren\npublisher.subscribe(subscriber)\nAusgabe auf der Konsole:
\nWert erhalten: 1\nWert erhalten: 2\nWert erhalten: 3\nWert erhalten: 4\nWert erhalten: 5\nAbgeschlossen: finished\nEine idiomatischere Methode mit dem Operator sink:
import Combine\n\nlet cancellable = [1, 2, 3, 4, 5].publisher\n .sink(receiveCompletion: { print($0) },\n receiveValue: { print($0) })\nHinweis: sink gibt ein AnyCancellable zurück. Dieses muss aufbewahrt werden, da sonst das Abonnement sofort nach Verlassen des Gültigkeitsbereichs gekündigt wird.
Wichtige Methoden/Funktionen
\n\n1. sink(receiveCompletion:receiveValue:)
\nWas es tut: Erstellt einen Subscriber, der alle Werte und den Abschluss vom Publisher empfängt. Dies ist die einfachste Möglichkeit, einen Stream zu abonnieren.
\nParameter:
\n- \n
receiveCompletion— ein Closure, das beim Abschluss aufgerufen wird (erfolgreich oder mit Fehler). AkzeptiertSubscribers.Completion<Failure>. \n receiveValue— ein Closure, das beim Empfang jedes neuen Werts aufgerufen wird. \n
Beispiel:
\nlet cancellable = Just("Hell