RxSwift är ett reaktivt programmeringsbibliotek för Swift som implementerar Observable-mönstret. Enligt uppgifter från ReactiveX, 2025 är detta den mest populära implementeringen av Reactive Extensions för Apples ekosystem. Observable fungerar som källa för händelser och Observer prenumererar för att ta emot dem.
Huvudpunkter
RxSwift är ett reaktivt programmeringsbibliotek för programmeringsspråket Swift, porterat från Reactive Extensions (Rx). Det gör det möjligt att beskriva asynkrona och händelsestyrda program genom Observable Sequence — en sekvens av data som är tillgänglig över tid. iOS-utvecklare använder RxSwift för att hantera nätverksförfrågningar, UI-händelser och strömmande data utan kapslade callbacks.
Grunden i RxSwift består av två nyckelprotokoll: ObservableType — händelsekällan som kan emittera tre typer av signaler: .next(value), .error(error) och .completed. Observer prenumererar på Observable via metoden subscribe och tar emot dessa händelser. Denna modell kallas Reactive Streams och garanterar att ingen händelse går förlorad vid korrekt prenumeration.
RxSwift tillhandahåller över 300 operatorer för att arbeta med strömmar: map transformerar varje händelse, filter släpper bara igenom lämpliga, flatMap vecklar ut kapslade Observable till en enda ström. Operatorer kombineras i kedjor och skapar en deklarativ databehandlingspipeline utan sidoeffekter.
Förutom grundläggande Observable tillhandahåller RxSwift specialiserade wrapper-typer. Single emitterar exakt ett värde eller ett fel — idealiskt för HTTP-förfrågningar. Completable avslutas med framgång eller fel utan värde — för skrivoperationer. Maybe kombinerar båda scenarierna: kan avslutas med värde, utan värde eller med fel. Dessa Traits förenklar semantiken och gör koden självdokumenterande.
Reaktiv programmering i RxSwift är byggd på Observer-mönstret. ObservableSequence är analogen till Sequence från standardbiblioteket, men med asynkron åtkomst till element. Händelseströmmen skickas genom en kedja av operatorer, där var och en returnerar en ny ObservableSequence utan att ändra den ursprungliga.
Operatorer i RxSwift är rena funktioner som tar emot en ObservableSequence och returnerar en ny. Till exempel skapar map en ny sekvens genom att tillämpa en transformation på varje element. Genom att kombinera operatorer bygger utvecklaren en pipeline där data passerar genom alla bearbetningsstadier utan mellanliggande variabler.
Schedulers är en abstraktion över exekveringstrådar i RxSwift. Scheduler avgör på vilken tråd koden ska exekveras: MainScheduler — UI-tråd, SerialDispatchQueueScheduler — bakgrundskö. Operatorerna subscribeOn och observeOn anger var arbetet utförs och var resultaten bearbetas.
RxSwift innehåller flera grundläggande typer, som var och en löser sin uppgift i den reaktiva pipelinen. Single — Observable som emitterar exakt ett värde eller fel, bekvämt för nätverksförfrågningar. Completable avslutas med framgång eller fel utan värde. Maybe kombinerar egenskaperna hos Single och Completable.
Subject är en het Observable som samtidigt fungerar som Observer. PublishSubject emitterar endast nya händelser till prenumeranter, BehaviorSubject — den senaste händelsen plus nya. Relay är en variant av Subject som inte emitterar .error eller .completed, vilket garanterar kontinuitet i strömmen. BehaviorRelay lagrar det aktuella värdet och passar för State-driven UI.
DisposeBag är en samling Disposable som automatiskt avslutar alla prenumerationer vid sin deallokering. I iOS läggs DisposeBag vanligtvis till i UIViewController eller UIView. När skärmen stängs rensas DisposeBag — detta förhindrar minnesläckor och referenser till icke-existerande UI-element.
Nedan visas ett exempel på att skapa en Observable från en dataarray med hjälp av operatorn map för att transformera strängar:
let observable = Observable.of("Swift", "RxSwift", "Reactive")
observable
.map { $0.uppercased() }
.subscribe(onNext: { value in
print("Mottaget: \(value)")
})
.disposed(by: disposeBag)
Det andra exemplet visar kombinationen av två nätverksförfrågningar med zip — operatorn väntar tills båda Observable emitterar ett värde och kombinerar resultaten i en 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)
Det tredje exemplet visar användning av BehaviorRelay för att lagra tillstånd och automatiskt uppdatera UI vid ändringar: varje ändring av state.accept() överförs omedelbart till prenumeranter, vilket är idealiskt för State-mönster i MVVM-arkitektur.
let state = BehaviorRelay(value: "idle")
state
.subscribe(onNext: { status in
print("Status: \(status)")
})
.disposed(by: disposeBag)
state.accept("loading") // Kommer att skriva ut: Status: loading
RxSwift skiljer sig från traditionella asynkrona metoder (Delegation, NotificationCenter, Callback) genom sin deklarativitet och komponerbarhet. Till skillnad från Combine stöder RxSwift iOS 9+ och har fler operatorer. Combine är dock integrerat i Foundation och SwiftUI på språknivå, vilket ger det en fördel i nya Apple-projekt.
Den största fördelen med RxSwift jämfört med GCD (Grand Central Dispatch) — möjligheten att kombinera och transformera dataströmmar på abstraktionsnivå, istället för att manuellt hantera köer. Samtidigt kräver RxSwift inlärning av reaktiva koncept, vilket höjer inträdes-tröskeln för teamet.
I praktiken används RxSwift i stora projekt där reaktiva kedjor kopplar samman UI-händelser, affärslogik och nätverksinteraktioner i en enda pipeline. I handelsapplikationer bearbetas till exempel kursströmmar via RxSwift: ticks kommer från WebSocket, passerar filtrering, grupperas efter tidsram och visas på diagrammet i realtid. Ett sådant scenario är svårt att implementera via Delegation eller NotificationCenter utan förlust av läsbarhet.
Alternativ till RxSwift inkluderar Combine (iOS 13+), AsyncSequence från Swift Concurrency (iOS 15+), samt biblioteket ReactiveSwift utan bindning till Apple-plattformar. Valet beror på den lägsta versionen av iOS som stöds och utvecklarnas erfarenhet. För nya iOS 15+-projekt väljer team ofta AsyncSequence — det kräver ingen biblioteksinstallation och använder språkets inbyggda Swift-konstruktioner.
Arkitekturmönster med RxSwift följer vanligtvis MVVM eller Clean Architecture. ViewModel innehåller all affärslogik i form av Observable-kedjor, View prenumererar på transformerad data. Input-Output-mönstret separerar inmatningshändelser (tryck, textinmatning) och utdatatillstånd (knapptext, loader-synlighet). Detta tillvägagångssätt förenklar testning: ViewModel testas utan UI via virtuella Schedulers.
RxSwift passar både för små projekt med några skärmar och stora enterprise-applikationer med dussintals moduler. I stora projekt genomsyrar reaktiva kedjor hela arkitekturen: från observation av UserDefaults via RxProperty till nätverksförfrågningar via Moya (RxSwift-wrapper över Alamofire). Varje modul är isolerad och kommunicerar via reaktiva gränssnitt, vilket förenklar implementeringsbyte utan att ändra prenumeranter. Med rätt arkitektur minskar RxSwift mängden kod jämfört med klassiska tillvägagångssätt, eftersom man inte behöver skriva boilerplate för KVO, Target-Action eller NotificationCenter.
RxSwift används aktivt i projekt med RxDataSources — ett bibliotek för reaktivt arbete med UITableView och UICollectionView. RxDataSources beräknar automatiskt skillnaden mellan gamla och nya celluppsättningar och tillämpar animerade ändringar. Detta befriar utvecklaren från manuellt arbete med beginUpdates/endUpdates och eliminerar krascher vid datainkonsistens.
För felsökning av RxSwift-kedjor finns operatorn debug() — den loggar alla händelser: subscribe, next, error, completed, dispose. Detta är ett oumbärligt verktyg vid utveckling av komplexa reaktiva pipelines. debug(String) tar emot en identifierare som visas i loggarna. För minnesprofilering visar RxSwift.Resources.total det totala antalet aktiva Observable och Disposable i applikationen — hjälper att upptäcka läckor när DisposeBag inte har rensats eller en retain cycle håller en prenumeration. Den extra operatorn takeUntil(self.rx.deallocated) avslutar automatiskt prenumerationen vid deallokering av objektet — detta är ytterligare ett skyddslager mot läckor.
När man skriver RxSwift-kod är det viktigt att följa principen en Observable per prenumeration: varje ViewController bör inte skapa mer än en prenumeration på en Observable — detta minskar risken för race condition. För memoisering av Observable används operatorn share(), som omvandlar en kall Observable till en het med en replay-buffert av storlek 1. När du arbetar med delade resurser, använd connect() för att hantera starten av emission — detta garanterar att alla prenumeranter ansluts före den första händelsen.
Testning av RxSwift-kod utförs via TestScheduler — en virtuell Scheduler som möjliggör tidsstyrning. testScheduler.createHotObservable(values) skapar en Observable med en fördefinierad sekvens av händelser enligt virtuell tid. testScheduler.start() startar bearbetningen. TestScheduler gör det möjligt att kontrollera ordningen och den virtuella tidsstämpeln för händelser utan verkliga fördröjningar, vilket gör testerna snabba och deterministiska.
Vanliga frågor
Observable är en kall källa: den emitterar inte händelser förrän prenumeration. Subject är het: den emitterar händelser oberoende av prenumeranter och tillåter manuell insättning av värden via onNext. PublishSubject överför endast nya händelser, BehaviorSubject — den senaste plus nya.
DisposeBag lagrar alla Disposable-prenumerationer. När DisposeBag deallokeras (till exempel när ViewController stängs), avslutas alla lagrade prenumerationer automatiskt. Detta garanterar att Observable inte längre skickar en händelse till ett redan förstört UI-objekt.
Om lägsta iOS-version är 13+ och teamet kan SwiftUI — välj Combine. Om projektet stöder iOS 12 och lägre eller kräver en större uppsättning operatorer — RxSwift. Combine ger bättre integration med Foundation (URLSession, Timer, NotificationCenter).
Schedulers abstraherar exekveringstrådar. subscribeOn anger på vilken Scheduler prenumerationen utförs (vanligtvis background). observeOn bestämmer på vilken Scheduler händelser tas emot (oftare MainScheduler för UI-uppdateringar). SerialDispatchQueueScheduler arbetar via GCD.
Ja, RxSwift kan integreras med SwiftUI via ObservableObject. Använd BehaviorRelay som @Published-egenskaper: prenumeration på Relay överför ändringar till Combine, och SwiftUI ritar om View via @ObservedObject. Detta är ett populärt migreringsmönster från UIKit till SwiftUI.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också