RxSwift ist eine reaktive Programmierbibliothek für Swift, die das Observable-Muster implementiert. Laut ReactiveX, 2025 ist es die beliebteste Implementierung von Reactive Extensions für das Apple-Ökosystem. Observable fungiert als Ereignisquelle, während Observer diese abonniert, um sie zu empfangen.
Wichtige Punkte
RxSwift ist eine reaktive Programmierbibliothek für die Sprache Swift, die von Reactive Extensions (Rx) portiert wurde. Sie ermöglicht die Beschreibung asynchroner und ereignisgesteuerter Programme durch Observable Sequence — eine Sequenz von Daten, die über die Zeit verfügbar sind. iOS-Entwickler verwenden RxSwift zur Verarbeitung von Netzwerkanfragen, UI-Ereignissen und Streaming-Daten ohne verschachtelte Callbacks.
Die Grundlage von RxSwift bilden zwei Schlüsselprotokolle: ObservableType — eine Ereignisquelle, die drei Arten von Signalen emittieren kann: .next(value), .error(error) und .completed. Observer abonniert Observable über die subscribe-Methode und empfängt diese Ereignisse. Dieses Modell heißt Reactive Streams und garantiert, dass bei korrektem Abonnement kein Ereignis verloren geht.
RxSwift bietet über 300 Operatoren für die Arbeit mit Streams: map transformiert jedes Ereignis, filter lässt nur passende durch, flatMap entfaltet verschachtelte Observables in einen einzigen Stream. Operatoren werden zu Ketten verbunden und erstellen eine deklarative Datenverarbeitungspipeline ohne Nebenwirkungen.
Neben dem grundlegenden Observable bietet RxSwift spezialisierte Wrapper-Typen. Single emittiert genau einen Wert oder einen Fehler — ideal für HTTP-Anfragen. Completable wird ohne Wert mit Erfolg oder Fehler abgeschlossen — für Schreiboperationen. Maybe kombiniert beide Szenarien: kann mit Wert, ohne Wert oder mit Fehler abgeschlossen werden. Diese Traits vereinfachen die Semantik und machen den Code selbstdokumentierend.
Reaktive Programmierung in RxSwift basiert auf dem Observer-Muster. ObservableSequence ist analog zu Sequence aus der Standardbibliothek, jedoch mit asynchronem Zugriff auf Elemente. Der Ereignisstrom wird durch eine Kette von Operatoren geleitet, wobei jeder eine neue ObservableSequence zurückgibt, ohne die ursprüngliche zu verändern.
Operatoren in RxSwift sind reine Funktionen, die eine ObservableSequence nehmen und eine neue zurückgeben. Beispielsweise erstellt map eine neue Sequenz durch Anwendung einer Transformation auf jedes Element. Durch Kombination von Operatoren baut der Entwickler eine Pipeline auf, in der Daten ohne Zwischenvariablen alle Verarbeitungsstufen durchlaufen.
Schedulers sind eine Abstraktion über Ausführungsthreads in RxSwift. Ein Scheduler bestimmt, auf welchem Thread der Code ausgeführt wird: MainScheduler — der UI-Thread, SerialDispatchQueueScheduler — eine Hintergrundwarteschlange. Die Operatoren subscribeOn und observeOn legen fest, wo die Arbeit ausgeführt und wo die Ergebnisse verarbeitet werden.
RxSwift enthält mehrere Basistypen, die jeweils ihre eigene Aufgabe in der reaktiven Pipeline lösen. Single ist ein Observable, das genau einen Wert oder Fehler emittiert, praktisch für Netzwerkanfragen. Completable wird ohne Wert mit Erfolg oder Fehler abgeschlossen. Maybe kombiniert die Eigenschaften von Single und Completable.
Subject ist ein heißes Observable, das gleichzeitig als Observer fungiert. PublishSubject emittiert nur neue Ereignisse an Abonnenten, BehaviorSubject — das letzte Ereignis plus neue. Relay ist eine Variante von Subject, die kein .error oder .completed emittiert und so die Stream-Kontinuität gewährleistet. BehaviorRelay speichert den aktuellen Wert und eignet sich für zustandsgesteuerte UIs.
DisposeBag ist eine Sammlung von Disposables, die bei ihrer Freigabe automatisch alle Abonnements kündigt. In iOS wird DisposeBag normalerweise zu UIViewController oder UIView hinzugefügt. Beim Schließen des Bildschirms wird DisposeBag geleert — dies verhindert Speicherlecks und den Zugriff auf nicht mehr vorhandene UI-Elemente.
Nachfolgend ein Beispiel zum Erstellen eines Observable aus einem Datenarray mit dem map-Operator zur Transformation von Zeichenketten:
let observable = Observable.of("Swift", "RxSwift", "Reactive")
observable
.map { $0.uppercased() }
.subscribe(onNext: { value in
print("Received: \(value)")
})
.disposed(by: disposeBag)
Das zweite Beispiel zeigt die Kombination zweier Netzwerkanfragen mit zip — der Operator wartet, bis beide Observables einen Wert emittieren, und kombiniert die Ergebnisse in einem Tupel:
let first = fetchUser(id: "123")
let second = fetchPosts(userId: "123")
Observable
.zip(first, second)
.observe(on: MainScheduler.instance)
.subscribe(onNext: { user, posts in
updateUI(user: user, posts: posts)
})
.disposed(by: disposeBag)
Das dritte Beispiel zeigt die Verwendung von BehaviorRelay zum Speichern von Zuständen und automatischen Aktualisieren der UI bei Änderungen: Jede state.accept()-Änderung wird sofort an Abonnenten übertragen, ideal für Zustandsmuster in der MVVM-Architektur.
let state = BehaviorRelay(value: "idle")
state
.subscribe(onNext: { status in
print("Status: \(status)")
})
.disposed(by: disposeBag)
state.accept("loading") // Prints: Status: loading
RxSwift unterscheidet sich von traditionellen asynchronen Methoden (Delegation, NotificationCenter, Callback) durch seine deklarative Natur und Komponierbarkeit. Im Gegensatz zu Combine unterstützt RxSwift iOS 9+ und hat mehr Operatoren. Allerdings ist Combine auf Sprachebene in Foundation und SwiftUI integriert, was ihm einen Vorteil in neuen Apple-Projekten verschafft.
Der Hauptvorteil von RxSwift gegenüber GCD (Grand Central Dispatch) ist die Fähigkeit, Datenströme auf Abstraktionsebene zu kombinieren und zu transformieren, anstatt Warteschlangen manuell zu verwalten. Allerdings erfordert RxSwift das Erlernen reaktiver Konzepte, was die Einstiegshürde für das Team erhöht.
In der Praxis wird RxSwift in großen Projekten eingesetzt, in denen reaktive Ketten UI-Ereignisse, Geschäftslogik und Netzwerkinteraktion in einer einzigen Pipeline verbinden. Beispielsweise werden in Handelsanwendungen Kursströme über RxSwift verarbeitet: Ticks kommen von WebSocket, durchlaufen Filterung, werden nach Zeitrahmen gruppiert und in Echtzeit auf einem Chart angezeigt. Dieses Szenario ist mit Delegation oder NotificationCenter kaum ohne Lesbarkeitsverlust umsetzbar.
Alternativen zu RxSwift umfassen Combine (iOS 13+), AsyncSequence aus Swift Concurrency (iOS 15+) sowie Drittanbieterbibliotheken wie ReactiveSwift ohne Bindung an Apple-Plattformen. Die Wahl hängt von der minimal unterstützten iOS-Version und der Erfahrung der Entwickler ab. Für neue iOS 15+-Projekte wählen Teams oft AsyncSequence — es erfordert keine Bibliotheksinstallation und verwendet native Swift-Sprachkonstrukte.
Architekturmuster mit RxSwift folgen in der Regel MVVM oder Clean Architecture. ViewModel enthält die gesamte Geschäftslogik als Observable-Ketten, View abonniert die transformierten Daten. Das Input-Output-Muster trennt Eingabeereignisse (Tippen, Texteingabe) von Ausgabezuständen (Schaltflächentext, Lader-Sichtbarkeit). Dieser Ansatz vereinfacht das Testen: ViewModel wird ohne UI über virtuelle Schedulers getestet.
RxSwift eignet sich sowohl für kleine Projekte mit wenigen Bildschirmen als auch für große Unternehmensanwendungen mit Dutzenden von Modulen. In großen Projekten durchziehen reaktive Ketten die gesamte Architektur: von der UserDefaults-Überwachung über RxProperty bis zu Netzwerkanfragen über Moya (ein RxSwift-Wrapper über Alamofire). Jedes Modul ist isoliert und kommuniziert über reaktive Schnittstellen, was den Austausch der Implementierung ohne Änderung der Abonnenten vereinfacht. Bei richtiger Architektur reduziert RxSwift die Code-Menge im Vergleich zu klassischen Ansätzen, da kein Boilerplate für KVO, Target-Action oder NotificationCenter geschrieben werden muss.
RxSwift wird aktiv in Projekten mit RxDataSources eingesetzt — einer Bibliothek für reaktive Arbeit mit UITableView und UICollectionView. RxDataSources berechnet automatisch die Differenz zwischen alten und neuen Zellsätzen und wendet animierte Änderungen an. Dies befreit den Entwickler von manueller Arbeit mit beginUpdates/endUpdates und beseitigt Abstürze aufgrund von Dateninkonsistenzen.
Zum Debuggen von RxSwift-Ketten gibt es den Operator debug() — er protokolliert alle Ereignisse: subscribe, next, error, completed, dispose. Dies ist ein unverzichtbares Werkzeug bei der Entwicklung komplexer reaktiver Pipelines. debug(String) nimmt eine Kennung entgegen, die in den Logs erscheint. Zur Speicherprofilierung zeigt RxSwift.Resources.total die Gesamtzahl aktiver Observables und Disposables in der Anwendung — hilft bei der Identifizierung von Lecks, wenn DisposeBag nicht geleert wurde oder ein retain cycle ein Abonnement hält. Der zusätzliche Operator takeUntil(self.rx.deallocated) kündigt das Abonnement automatisch bei Freigabe des Objekts — eine weitere Schutzschicht gegen Speicherlecks.
Beim Schreiben von RxSwift-Code ist es wichtig, das Prinzip ein Observable pro Abonnement zu befolgen: Jeder ViewController sollte nicht mehr als ein Abonnement für dasselbe Observable erstellen — dies reduziert das Risiko von Wettlaufsituationen. Zur Memoisation von Observables wird der Operator share() verwendet, der ein kaltes Observable mit einem Replay-Puffer der Größe 1 in ein heißes verwandelt. Bei der Arbeit mit gemeinsamen Ressourcen verwenden Sie connect() zur Steuerung des Emissionsbeginns — dies stellt sicher, dass alle Abonnenten vor dem ersten Ereignis verbunden sind.
Das Testen von RxSwift-Code erfolgt über TestScheduler — einen virtuellen Scheduler, der die Zeitsteuerung ermöglicht. testScheduler.createHotObservable(values) erstellt ein Observable mit einer vordefinierten Ereignissequenz nach virtueller Zeit. testScheduler.start() startet die Verarbeitung. TestScheduler ermöglicht die Überprüfung, in welcher Reihenfolge und zu welchem virtuellen Zeitstempel Ereignisse auftreten, ohne reale Verzögerungen, was Tests schnell und deterministisch macht.
Häufig gestellte Fragen
Observable ist eine kalte Quelle: Es emittiert erst nach Abonnement Ereignisse. Subject ist heiß: Es emittiert Ereignisse unabhängig von Abonnenten und erlaubt das manuelle Einfügen von Werten über onNext. PublishSubject übergibt nur neue Ereignisse, BehaviorSubject — das letzte plus neue.
DisposeBag speichert alle Disposable-Abonnements. Wenn DisposeBag freigegeben wird (z.B. beim Schließen eines ViewControllers), werden alle gespeicherten Abonnements automatisch gekündigt. Dadurch wird garantiert, dass Observable kein Ereignis mehr an ein zerstörtes UI-Objekt sendet.
Wenn die minimale iOS-Version 13+ ist und das Team SwiftUI kennt — wählen Sie Combine. Wenn das Projekt iOS 12 und älter unterstützt oder einen größeren Operatorsatz benötigt — RxSwift. Combine bietet bessere Integration mit Foundation (URLSession, Timer, NotificationCenter).
Schedulers abstrahieren Ausführungsthreads. subscribeOn gibt an, auf welchem Scheduler das Abonnement durchgeführt wird (normalerweise Hintergrund). observeOn bestimmt, auf welchem Scheduler Ereignisse empfangen werden (meist MainScheduler für UI-Updates). SerialDispatchQueueScheduler arbeitet über GCD.
Ja, RxSwift kann über ObservableObject in SwiftUI integriert werden. Verwenden Sie BehaviorRelay als @Published-Eigenschaften: Das Abonnement von Relay überträgt Änderungen an Combine, und SwiftUI zeichnet die View über @ObservedObject neu. Dies ist ein beliebtes Migrationsmuster von UIKit zu SwiftUI.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch