RxSwift je knihovna reaktivního programování pro Swift, která implementuje vzor Observable. Podle údajů ReactiveX, 2025 se jedná o nejpopulárnější implementaci Reactive Extensions pro ekosystém Apple. Observable slouží jako zdroj událostí a Observer se přihlašuje k jejich příjmu.
Hlavní body
RxSwift je knihovna reaktivního programování pro jazyk Swift, portovaná z Reactive Extensions (Rx). Umožňuje popisovat asynchronní a událostmi řízené programy prostřednictvím Observable Sequence — sekvence dat dostupných v čase. iOS vývojáři používají RxSwift pro zpracování síťových požadavků, UI událostí a streamovaných dat bez vnořených callbacků.
Základ RxSwift tvoří dva klíčové protokoly: ObservableType — zdroj událostí, který může emitovat tři typy signálů: .next(value), .error(error) a .completed. Observer se přihlašuje k Observable pomocí metody subscribe a přijímá tyto události. Tento model se nazývá Reactive Streams a garantuje, že při správném odběru není ztracena žádná událost.
RxSwift poskytuje více než 300 operátorů pro práci s toky: map transformuje každou událost, filter propouští pouze vyhovující, flatMap rozbaluje vnořené Observable do jediného toku. Operátory se spojují do řetězců a vytvářejí deklarativní pipeline zpracování dat bez vedlejších efektů.
Kromě základního Observable poskytuje RxSwift specializované typy obalů. Single emituje přesně jednu hodnotu nebo chybu — ideální pro HTTP požadavky. Completable končí úspěchem nebo chybou bez hodnoty — pro operace zápisu. Maybe kombinuje oba scénáře: může skončit s hodnotou, bez hodnoty nebo s chybou. Tyto Traits zjednodušují sémantiku a činí kód samodokumentujícím.
Reaktivní programování v RxSwift je postaveno na vzoru Observer. ObservableSequence je analogií Sequence ze standardní knihovny, ale s asynchronním přístupem k prvkům. Tok událostí je předáván řetězcem operátorů, z nichž každý vrací novou ObservableSequence, aniž by měnil původní.
Operátory v RxSwift jsou čisté funkce, které přijímají jednu ObservableSequence a vracejí novou. Například map vytváří novou sekvenci aplikací transformace na každý prvek. Kombinováním operátorů vývojář buduje pipeline, kde data procházejí všemi fázemi zpracování bez mezi proměnných.
Schedulers je abstrakce nad vlákny provádění v RxSwift. Scheduler určuje, na kterém vlákně bude kód spuštěn: MainScheduler — UI vlákno, SerialDispatchQueueScheduler — fronta na pozadí. Operátory subscribeOn a observeOn určují, kde se práce provádí a kde se zpracovávají výsledky.
RxSwift zahrnuje několik základních typů, z nichž každý řeší svůj úkol v reaktivní pipeline. Single — Observable, který emituje přesně jednu hodnotu nebo chybu, vhodný pro síťové požadavky. Completable končí úspěchem nebo chybou bez hodnoty. Maybe kombinuje vlastnosti Single a Completable.
Subject je horký Observable, který zároveň funguje jako Observer. PublishSubject emituje pouze nové události odběratelům, BehaviorSubject — poslední událost plus nové. Relay je varianta Subject, která neemituje .error nebo .completed, čímž garantuje kontinuitu toku. BehaviorRelay ukládá aktuální hodnotu a je vhodný pro State-driven UI.
DisposeBag je kolekce Disposable, která automaticky ruší všechny odběry při své dealokaci. V iOS je DisposeBag obvykle přidáván do UIViewController nebo UIView. Při zavření obrazovky je DisposeBag vyčištěn — to zabraňuje únikům paměti a odkazům na neexistující prvky UI.
Níže je uveden příklad vytvoření Observable z pole dat pomocí operátoru map pro transformaci řetězců:
let observable = Observable.of("Swift", "RxSwift", "Reactive")
observable
.map { $0.uppercased() }
.subscribe(onNext: { value in
print("Obdrženo: \(value)")
})
.disposed(by: disposeBag)
Druhý příklad demonstruje spojení dvou síťových požadavků pomocí zip — operátor čeká, dokud oba Observable neemitují hodnotu, a spojí výsledky do n-tice:
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)
Třetí příklad ukazuje použití BehaviorRelay pro ukládání stavu a automatickou aktualizaci UI při změnách: každá změna state.accept() je okamžitě předána odběratelům, což je ideální pro State vzory v architektuře MVVM.
let state = BehaviorRelay(value: "idle")
state
.subscribe(onNext: { status in
print("Status: \(status)")
})
.disposed(by: disposeBag)
state.accept("loading") // Vypíše: Status: loading
RxSwift se liší od tradičních metod asynchronnosti (Delegation, NotificationCenter, Callback) deklarativností a kompozabilitou. Na rozdíl od Combine podporuje RxSwift iOS 9+ a má více operátorů. Combine je však integrován do Foundation a SwiftUI na úrovni jazyka, což mu dává výhodu v nových projektech Apple.
Hlavní výhoda RxSwift oproti GCD (Grand Central Dispatch) — možnost kombinovat a transformovat datové toky na úrovni abstrakce namísto ručního řízení front. Současně RxSwift vyžaduje učení konceptů reaktivního přístupu, což zvyšuje práh vstupu pro tým.
V praxi se RxSwift používá ve velkých projektech, kde reaktivní řetězce spojují UI události, obchodní logiku a síťové interakce v jedné pipeline. Například v obchodních aplikacích jsou toky kotací zpracovávány přes RxSwift: ticky přicházejí z WebSocketu, procházejí filtrací, seskupují se podle časového rámce a zobrazují se na grafu v reálném čase. Tento scénář je obtížné realizovat přes Delegation nebo NotificationCenter bez ztráty čitelnosti.
Alternativy RxSwift zahrnují Combine (iOS 13+), AsyncSequence ze Swift Concurrency (iOS 15+) a také knihovnu ReactiveSwift bez vazby na platformy Apple. Volba závisí na minimální podporované verzi iOS a zkušenostech vývojářů. Pro nové projekty iOS 15+ týmy často volí AsyncSequence — nevyžaduje instalaci knihovny a používá nativní konstrukce jazyka Swift.
Architektonické vzory s RxSwift obvykle následují MVVM nebo Clean Architecture. ViewModel obsahuje veškerou obchodní logiku ve formě řetězců Observable, View se přihlašuje k transformovaným datům. Vzor Input-Output odděluje vstupní události (klepnutí, zadávání textu) a výstupní stavy (text tlačítka, viditelnost loaderu). Tento přístup zjednodušuje testování: ViewModel je testován bez UI prostřednictvím virtuálních Schedulerů.
RxSwift je vhodný jak pro malé projekty s několika obrazovkami, tak pro velké enterprise aplikace s desítkami modulů. Ve velkých projektech prostupují reaktivní řetězce celou architekturou: od sledování UserDefaults přes RxProperty až po síťové požadavky přes Moya (RxSwift obal nad Alamofire). Každý modul je izolován a komunikuje prostřednictvím reaktivních rozhraní, což zjednodušuje výměnu implementace bez změny odběratelů. Při správné architektuře RxSwift snižuje množství kódu ve srovnání s klasickými přístupy, protože není třeba psát boilerplate pro KVO, Target-Action nebo NotificationCenter.
RxSwift je aktivně používán v projektech s RxDataSources — knihovnou pro reaktivní práci s UITableView a UICollectionView. RxDataSources automaticky vypočítává rozdíl mezi starou a novou sadou buněk a aplikuje animované změny. To zbavuje vývojáře ruční práce s beginUpdates/endUpdates a eliminuje pády při nesouladu dat.
Pro ladění řetězců RxSwift existuje operátor debug() — loguje všechny události: subscribe, next, error, completed, dispose. Je to nepostradatelný nástroj při vývoji složitých reaktivních pipeline. debug(String) přijímá identifikátor zobrazený v logech. Pro profilování paměti RxSwift.Resources.total zobrazuje celkový počet aktivních Observable a Disposable v aplikaci — pomáhá odhalit úniky, když DisposeBag není vyčištěn nebo retain cycle udržuje odběr. Dodatečný operátor takeUntil(self.rx.deallocated) automaticky ruší odběr při dealokaci objektu — to je další vrstva ochrany proti únikům.
Při psaní kódu RxSwift je důležité dodržovat princip jeden Observable na odběr: každý ViewController by neměl vytvářet více než jeden odběr k jednomu Observable — snižuje to riziko race condition. Pro memoizaci Observable se používá operátor share(), který mění studený Observable na horký s replay bufferem velikosti 1. Při práci se sdílenými prostředky použijte connect() pro řízení zahájení emise — to garantuje, že všichni odběratelé se připojí před první událostí.
Testování kódu RxSwift se provádí pomocí TestScheduler — virtuálního Scheduleru, který umožňuje řízení času. testScheduler.createHotObservable(values) vytváří Observable s předdefinovanou sekvencí událostí podle virtuálního času. testScheduler.start() spouští zpracování. TestScheduler umožňuje kontrolovat pořadí a virtuální časové razítko událostí bez reálných zpoždění, což dělá testy rychlými a deterministickými.
Často kladené otázky
Observable je studený zdroj: neemituje události až do odběru. Subject je horký: emituje události nezávisle na odběratelích a umožňuje ruční vkládání hodnot přes onNext. PublishSubject předává pouze nové události, BehaviorSubject — poslední plus nové.
DisposeBag ukládá všechny Disposable odběry. Když je DisposeBag dealokován (například při zavření ViewController), všechny uložené odběry jsou automaticky zrušeny. To garantuje, že Observable již nepošle událost zničenému objektu UI.
Pokud je minimální verze iOS 13+ a tým zná SwiftUI — vyberte Combine. Pokud projekt podporuje iOS 12 a nižší nebo vyžaduje větší sadu operátorů — RxSwift. Combine poskytuje lepší integraci s Foundation (URLSession, Timer, NotificationCenter).
Schedulers abstrahují vlákna provádění. subscribeOn určuje, na kterém Scheduleru se provádí odběr (obvykle background). observeOn určuje, na kterém Scheduleru jsou přijímány události (častěji MainScheduler pro UI aktualizace). SerialDispatchQueueScheduler pracuje přes GCD.
Ano, RxSwift lze integrovat se SwiftUI prostřednictvím ObservableObject. Použijte BehaviorRelay jako @Published vlastnosti: odběr Relay přenáší změny do Combine a SwiftUI překresluje View přes @ObservedObject. To je populární vzor migrace z UIKit na SwiftUI.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také