RxSwift — co to je, klíčové pojmy a reaktivní programování

Autor: IT Sectr Publikováno: 2026-03-17 Doba čtení: 8 min

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 — implementace Reactive Extensions pro Swift s podporou Observable, Subject a 300+ operátorů
  • Observable — zdroj událostí, který emituje hodnoty, chyby nebo signál dokončení
  • Subject — zároveň Observable a Observer, umožňuje ruční vkládání událostí do toku
  • DisposeBag — mechanismus automatické správy paměti, který ruší odběry při dealokaci
  • Schedulers — spravují vlákna provádění, umožňují přepínání mezi main a background frontami

Co je RxSwift?

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ů.

Observable a Observer

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.

Transformační operátory

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ů.

Traits: Single, Completable, Maybe

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.

Jak funguje reaktivní programování v RxSwift

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í.

Řetězce operátorů

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 a vlákna provádění

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.

Hlavní komponenty RxSwift

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 a Relay

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

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.

Příklady kódu RxSwift

Níže je uveden příklad vytvoření Observable z pole dat pomocí operátoru map pro transformaci řetězců:

swift
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:

swift
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.

swift
let state = BehaviorRelay(value: "idle")

state
    .subscribe(onNext: { status in
        print("Status: \(status)")
    })
    .disposed(by: disposeBag)

state.accept("loading") // Vypíše: Status: loading

RxSwift vs jiné přístupy

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.

Nejlepší postupy RxSwift

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

Jaký je rozdíl mezi Observable a Subject v RxSwift?

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é.

Jak DisposeBag zabraňuje únikům paměti v RxSwift?

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.

Co vybrat: RxSwift nebo Combine v novém iOS projektu?

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).

Jak fungují Schedulers v RxSwift?

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.

Lze RxSwift použít se SwiftUI?

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í

  • RxSwift — knihovna reaktivního programování založená na Reactive Extensions a vzoru Observable
  • Observable emituje tři typy signálů: .next, .error a .completed
  • Subject (PublishSubject, BehaviorSubject) kombinuje Observable a Observer pro horké toky
  • DisposeBag spravuje životní cyklus odběrů a zabraňuje únikům paměti
  • Operátory (map, filter, flatMap, zip) umožňují vytvářet deklarativní zpracovatelské řetězce
  • Schedulers přepínají provádění mezi frontami na pozadí a vláknem UI
  • Pro nový vývoj na iOS 13+ zvažte Combine jako vestavěnou alternativu

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í.

Prodiskutovat projekt

Přečtěte si také