RxSwift is een reactieve programmeerbibliotheek voor Swift die het Observable-patroon implementeert. Volgens ReactiveX, 2025 is dit de populairste implementatie van Reactive Extensions voor het Apple-ecosysteem. Observable fungeert als bron van gebeurtenissen en Observer abonneert zich om ze te ontvangen.
Belangrijkste punten
RxSwift is een reactieve programmeerbibliotheek voor de programmeertaal Swift, overgezet van Reactive Extensions (Rx). Het maakt het mogelijk om asynchrone en gebeurtenisgestuurde programma's te beschrijven via Observable Sequence — een reeks gegevens die in de loop van de tijd beschikbaar zijn. iOS-ontwikkelaars gebruiken RxSwift voor het afhandelen van netwerkverzoeken, UI-gebeurtenissen en streaminggegevens zonder geneste callbacks.
De basis van RxSwift bestaat uit twee belangrijke protocollen: ObservableType — de gebeurtenisbron die drie soorten signalen kan emitteren: .next(value), .error(error) en .completed. Observer abonneert zich op Observable via de subscribe-methode en ontvangt deze gebeurtenissen. Dit model heet Reactive Streams en garandeert dat geen enkele gebeurtenis verloren gaat bij correcte abonnering.
RxSwift biedt meer dan 300 operators voor het werken met stromen: map transformeert elke gebeurtenis, filter laat alleen de juiste door, flatMap vouwt geneste Observable's in één stroom uit. Operators worden aan elkaar gekoppeld tot ketens, waardoor een declaratieve gegevensverwerkingspijplijn zonder bijwerkingen ontstaat.
Naast de basis Observable biedt RxSwift gespecialiseerde wrapper-types. Single emitteert precies één waarde of fout — ideaal voor HTTP-verzoeken. Completable eindigt met succes of fout zonder waarde — voor schrijfbewerkingen. Maybe combineert beide scenario's: kan eindigen met waarde, zonder waarde of met fout. Deze Traits vereenvoudigen de semantiek en maken de code zelfdocumenterend.
Reactief programmeren in RxSwift is gebaseerd op het Observer-patroon. ObservableSequence is de analogie van Sequence uit de standaardbibliotheek, maar met asynchrone toegang tot elementen. De gebeurtenissenstroom wordt door een keten van operators geleid, die elk een nieuwe ObservableSequence retourneren zonder de originele te wijzigen.
Operators in RxSwift zijn pure functies die één ObservableSequence ontvangen en een nieuwe retourneren. map creëert bijvoorbeeld een nieuwe reeks door een transformatie op elk element toe te passen. Door operators te combineren bouwt de ontwikkelaar een pijplijn waarin gegevens alle verwerkingsstadia doorlopen zonder tussenliggende variabelen.
Schedulers is een abstractie over uitvoeringsthreads in RxSwift. Scheduler bepaalt op welke thread de code wordt uitgevoerd: MainScheduler — UI-thread, SerialDispatchQueueScheduler — achtergrondwachtrij. De operators subscribeOn en observeOn bepalen waar het werk wordt gedaan en waar de resultaten worden verwerkt.
RxSwift bevat verschillende basistypen, die elk hun taak in de reactieve pijplijn vervullen. Single — Observable die precies één waarde of fout emitteert, handig voor netwerkverzoeken. Completable eindigt met succes of fout zonder waarde. Maybe combineert de eigenschappen van Single en Completable.
Subject is een hete Observable die tegelijkertijd als Observer fungeert. PublishSubject emitteert alleen nieuwe gebeurtenissen naar abonnees, BehaviorSubject — de laatste gebeurtenis plus nieuwe. Relay is een variant van Subject die geen .error of .completed emitteert, wat de continuïteit van de stroom garandeert. BehaviorRelay slaat de huidige waarde op en is geschikt voor State-driven UI.
DisposeBag is een verzameling Disposable's die automatisch alle abonnementen annuleert bij deallocatie. In iOS wordt DisposeBag meestal toegevoegd aan UIViewController of UIView. Wanneer het scherm wordt gesloten, wordt DisposeBag opgeschoond — dit voorkomt geheugenlekken en verwijzingen naar niet-bestaande UI-elementen.
Hieronder wordt een voorbeeld getoond van het maken van een Observable uit een gegevensarray met behulp van de map-operator voor het transformeren van strings:
let observable = Observable.of("Swift", "RxSwift", "Reactive")
observable
.map { $0.uppercased() }
.subscribe(onNext: { value in
print("Ontvangen: \(value)")
})
.disposed(by: disposeBag)
Het tweede voorbeeld demonstreert het combineren van twee netwerkverzoeken met zip — de operator wacht tot beide Observable's een waarde emitteren en combineert de resultaten in een tuple:
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)
Het derde voorbeeld toont het gebruik van BehaviorRelay voor het opslaan van status en het automatisch bijwerken van de UI bij wijzigingen: elke wijziging state.accept() wordt onmiddellijk doorgegeven aan abonnees, wat ideaal is voor State-patronen in MVVM-architectuur.
let state = BehaviorRelay(value: "idle")
state
.subscribe(onNext: { status in
print("Status: \(status)")
})
.disposed(by: disposeBag)
state.accept("loading") // Toont: Status: loading
RxSwift verschilt van traditionele asynchrone methoden (Delegation, NotificationCenter, Callback) door zijn declarativiteit en composability. In tegenstelling tot Combine ondersteunt RxSwift iOS 9+ en heeft het meer operators. Combine is echter op taalniveau geïntegreerd in Foundation en SwiftUI, wat het een voordeel geeft in nieuwe Apple-projecten.
Het belangrijkste voordeel van RxSwift ten opzichte van GCD (Grand Central Dispatch) — de mogelijkheid om gegevensstromen op abstractieniveau te combineren en transformeren in plaats van handmatig wachtrijen te beheren. Tegelijkertijd vereist RxSwift het leren van reactieve concepten, wat de instapdrempel voor het team verhoogt.
In de praktijk wordt RxSwift gebruikt in grote projecten waar reactieve ketens UI-gebeurtenissen, bedrijfslogica en netwerkinteracties in één pijplijn verbinden. In handelsapps worden bijvoorbeeld koersstromen via RxSwift verwerkt: ticks komen van WebSocket, worden gefilterd, gegroepeerd op tijdframe en in realtime op de grafiek weergegeven. Een dergelijk scenario is moeilijk te realiseren via Delegation of NotificationCenter zonder verlies van leesbaarheid.
Alternatieven voor RxSwift zijn Combine (iOS 13+), AsyncSequence van Swift Concurrency (iOS 15+), en de bibliotheek ReactiveSwift zonder binding aan Apple-platforms. De keuze hangt af van de minimale ondersteunde iOS-versie en de ervaring van de ontwikkelaars. Voor nieuwe projecten met iOS 15+ kiezen teams vaak voor AsyncSequence — het vereist geen bibliotheekinstallatie en gebruikt native taalconstructies van Swift.
Architectuurpatronen met RxSwift volgen meestal MVVM of Clean Architecture. ViewModel bevat alle bedrijfslogica in de vorm van Observable-ketens, View abonneert zich op getransformeerde gegevens. Het Input-Output-patroon scheidt invoergebeurtenissen (tikken, tekstinvoer) en uitvoerstatussen (knoptekst, zichtbaarheid van loader). Deze aanpak vereenvoudigt testen: ViewModel wordt zonder UI getest via virtuele Schedulers.
RxSwift is geschikt voor zowel kleine projecten met een paar schermen als grote enterprise-applicaties met tientallen modules. In grote projecten doordringen reactieve ketens de hele architectuur: van het observeren van UserDefaults via RxProperty tot netwerkverzoeken via Moya (RxSwift-wrapper over Alamofire). Elke module is geïsoleerd en communiceert via reactieve interfaces, wat implementatievervanging vereenvoudigt zonder abonnees te wijzigen. Met de juiste architectuur vermindert RxSwift de hoeveelheid code in vergelijking met klassieke benaderingen, omdat er geen boilerplate nodig is voor KVO, Target-Action of NotificationCenter.
RxSwift wordt actief gebruikt in projecten met RxDataSources — een bibliotheek voor reactief werken met UITableView en UICollectionView. RxDataSources berekent automatisch het verschil tussen de oude en nieuwe set cellen en past geanimeerde wijzigingen toe. Dit bevrijdt de ontwikkelaar van handmatig werk met beginUpdates/endUpdates en elimineert crashes bij gegevensinconsistentie.
Voor het debuggen van RxSwift-ketens is er de operator debug() — deze logt alle gebeurtenissen: subscribe, next, error, completed, dispose. Dit is een onmisbaar hulpmiddel bij het ontwikkelen van complexe reactieve pijplijnen. debug(String) accepteert een identificatie die in de logs wordt weergegeven. Voor geheugenprofilering toont RxSwift.Resources.total het totale aantal actieve Observable's en Disposable's in de app — helpt bij het opsporen van lekken wanneer DisposeBag niet is opgeschoond of een retain cycle een abonnement vasthoudt. De extra operator takeUntil(self.rx.deallocated) annuleert automatisch het abonnement bij deallocatie van het object — dit is nog een beschermingslaag tegen lekken.
Bij het schrijven van RxSwift-code is het belangrijk het principe één Observable per abonnement te volgen: elke ViewController mag niet meer dan één abonnement op één Observable maken — dit vermindert het risico op race conditions. Voor memoïsatie van Observable wordt de operator share() gebruikt, die een koude Observable omzet in een hete met een replay-buffer van grootte 1. Gebruik connect() bij het werken met gedeelde bronnen om de start van de emissie te beheren — dit garandeert dat alle abonnees worden verbonden vóór de eerste gebeurtenis.
Het testen van RxSwift-code wordt uitgevoerd via TestScheduler — een virtuele Scheduler waarmee tijd kan worden beheerd. testScheduler.createHotObservable(values) maakt een Observable met een vooraf gedefinieerde reeks gebeurtenissen op virtuele tijd. testScheduler.start() start de verwerking. TestScheduler maakt het mogelijk om de volgorde en virtuele tijdstempel van gebeurtenissen te controleren zonder echte vertragingen, wat tests snel en deterministisch maakt.
Veelgestelde vragen
Observable is een koude bron: het emitteert geen gebeurtenissen vóór abonnering. Subject is heet: het emitteert gebeurtenissen onafhankelijk van abonnees en maakt handmatig invoegen van waarden via onNext mogelijk. PublishSubject geeft alleen nieuwe gebeurtenissen door, BehaviorSubject — de laatste plus nieuwe.
DisposeBag slaat alle Disposable-abonnementen op. Wanneer DisposeBag wordt gedealloceerd (bijvoorbeeld bij het sluiten van ViewController), worden alle opgeslagen abonnementen automatisch geannuleerd. Dit garandeert dat Observable geen gebeurtenis meer zal sturen naar een reeds vernietigd UI-object.
Als de minimale iOS-versie 13+ is en het team SwiftUI kent — kies Combine. Als het project iOS 12 en lager ondersteunt of een grotere set operators nodig heeft — RxSwift. Combine biedt betere integratie met Foundation (URLSession, Timer, NotificationCenter).
Schedulers abstraheren uitvoeringsthreads. subscribeOn geeft aan op welke Scheduler het abonnement wordt uitgevoerd (meestal background). observeOn bepaalt op welke Scheduler gebeurtenissen worden ontvangen (meestal MainScheduler voor UI-updates). SerialDispatchQueueScheduler werkt via GCD.
Ja, RxSwift kan worden geïntegreerd met SwiftUI via ObservableObject. Gebruik BehaviorRelay als @Published-eigenschappen: abonneren op Relay stuurt wijzigingen door naar Combine, en SwiftUI hertekent View via @ObservedObject. Dit is een populair migratiepatroon van UIKit naar SwiftUI.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook