Az RxSwift egy reaktív programozási könyvtár Swifthez, amely az Observable mintát valósítja meg. A ReactiveX, 2025 adatai szerint ez a Reactive Extensions legnépszerűbb implementációja az Apple ökoszisztémához. Az Observable események forrásaként működik, az Observer pedig feliratkozik azok fogadására.
Főbb pontok
Az RxSwift egy reaktív programozási könyvtár a Swift nyelvhez, amely a Reactive Extensions (Rx) portolásából származik. Lehetővé teszi aszinkron és eseményvezérelt programok leírását Observable Sequence — időben elérhető adatsorozat — segítségével. Az iOS fejlesztők az RxSwift-et használják hálózati kérések, UI események és adatfolyamok kezelésére beágyazott callback-ek nélkül.
Az RxSwift alapját két kulcsprotokoll alkotja: ObservableType — az eseményforrás, amely háromféle jelet bocsáthat ki: .next(value), .error(error) és .completed. Az Observer a subscribe metódussal iratkozik fel az Observable-re és fogadja ezeket az eseményeket. Ezt a modellt Reactive Streams-nek hívják, és garantálja, hogy egyetlen esemény sem vész el helyes feliratkozás esetén.
Az RxSwift több mint 300 operátort kínál a folyamokkal való munkához: a map minden eseményt átalakít, a filter csak a megfelelőket engedi át, a flatMap a beágyazott Observable-eket egyetlen folyamba bontja ki. Az operátorok láncokba kapcsolódva deklaratív adatfeldolgozó csővezetéket hoznak létre mellékhatások nélkül.
Az alap Observable mellett az RxSwift speciális burkolótípusokat kínál. A Single pontosan egy értéket vagy hibát bocsát ki — ideális HTTP kérésekhez. A Completable érték nélkül ér véget sikerrel vagy hibával — írási műveletekhez. A Maybe mindkét forgatókönyvet egyesíti: végződhet értékkel, érték nélkül vagy hibával. Ezek a Traits egyszerűsítik a szemantikát és öndokumentálóvá teszik a kódot.
A reaktív programozás az RxSwift-ben az Observer mintára épül. Az ObservableSequence a standard könyvtár Sequence analógja, de aszinkron hozzáféréssel az elemekhez. Az eseményfolyam operátorok láncán keresztül halad, amelyek mindegyike új ObservableSequence-et ad vissza anélkül, hogy az eredetit módosítaná.
Az RxSwift operátorai tiszta függvények, amelyek egy ObservableSequence-et fogadnak és egy újat adnak vissza. Például a map egy új sorozatot hoz létre azáltal, hogy transzformációt alkalmaz minden elemre. Az operátorok kombinálásával a fejlesztő olyan csővezetéket épít, ahol az adatok köztes változók nélkül haladnak át a feldolgozás minden szakaszán.
A Schedulers egy absztrakció a végrehajtási szálak felett az RxSwift-ben. A Scheduler meghatározza, hogy a kód melyik szálon fusson: MainScheduler — UI szál, SerialDispatchQueueScheduler — háttérsor. A subscribeOn és observeOn operátorok megadják, hogy a munka hol történik és az eredmények hol kerülnek feldolgozásra.
Az RxSwift több alapvető típust tartalmaz, amelyek mindegyike megoldja a saját feladatát a reaktív csővezetékben. A Single — Observable, amely pontosan egy értéket vagy hibát bocsát ki, kényelmes hálózati kérésekhez. A Completable érték nélkül ér véget sikerrel vagy hibával. A Maybe egyesíti a Single és Completable tulajdonságait.
A Subject egy forró Observable, amely egyidejűleg Observerként is funkcionál. A PublishSubject csak új eseményeket bocsát ki az előfizetőknek, a BehaviorSubject — az utolsó eseményt plusz az újakat. A Relay a Subject egy változata, amely nem bocsát ki .error vagy .completed eseményeket, garantálva a folyam folytonosságát. A BehaviorRelay tárolja az aktuális értéket és alkalmas State-driven UI-hoz.
A DisposeBag Disposable-ek gyűjteménye, amely automatikusan lemondja az összes feliratkozást a saját felszabadításakor. iOS-ben a DisposeBag általában UIViewController-hez vagy UIView-hez kerül hozzáadásra. A képernyő bezárásakor a DisposeBag törlődik — ez megakadályozza a memóriaszivárgást és a nem létező UI elemekre való hivatkozást.
Az alábbi példa egy Observable létrehozását mutatja be adatok tömbjéből a map operátor használatával sztringek átalakítására:
let observable = Observable.of("Swift", "RxSwift", "Reactive")
observable
.map { $0.uppercased() }
.subscribe(onNext: { value in
print("Megkapta: \(value)")
})
.disposed(by: disposeBag)
A második példa két hálózati kérés összekapcsolását mutatja be a zip segítségével — az operátor megvárja, amíg mindkét Observable értéket bocsát ki, és egy tuple-ben egyesíti az eredményeket:
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)
A harmadik példa a BehaviorRelay használatát mutatja be állapot tárolására és a UI automatikus frissítésére változások esetén: minden state.accept() változás azonnal továbbításra kerül az előfizetőknek, ami ideális az MVVM architektúrában használt State mintákhoz.
let state = BehaviorRelay(value: "idle")
state
.subscribe(onNext: { status in
print("Status: \(status)")
})
.disposed(by: disposeBag)
state.accept("loading") // Kiírja: Status: loading
Az RxSwift a hagyományos aszinkron módszerektől (Delegation, NotificationCenter, Callback) deklaratív jellegében és kompozíciós képességében különbözik. A Combine-tól eltérően az RxSwift támogatja az iOS 9+ verziót és több operátorral rendelkezik. A Combine azonban nyelvi szinten integrálódik a Foundation és SwiftUI keretrendszerekbe, ami előnyt jelent az új Apple projektekben.
Az RxSwift fő előnye a GCD-vel (Grand Central Dispatch) szemben — az adatfolyamok kombinálásának és átalakításának képessége absztrakciós szinten, ahelyett hogy manuálisan kellene kezelni a sorokat. Ugyanakkor az RxSwift megköveteli a reaktív megközelítés koncepcióinak elsajátítását, ami növeli a belépési küszöböt a csapat számára.
A gyakorlatban az RxSwift-et olyan nagy projektekben használják, ahol a reaktív láncok összekötik a UI eseményeket, az üzleti logikát és a hálózati interakciókat egyetlen csővezetékben. Például kereskedési alkalmazásokban az árfolyamfolyamok RxSwift-en keresztül kerülnek feldolgozásra: a tick-ek WebSocket-ről érkeznek, szűrésen esnek át, időkeret szerint csoportosulnak és valós időben jelennek meg a diagramon. Egy ilyen forgatókönyvet nehéz megvalósítani Delegation vagy NotificationCenter segítségével az olvashatóság elvesztése nélkül.
Az RxSwift alternatívái közé tartozik a Combine (iOS 13+), az AsyncSequence a Swift Concurrency-ből (iOS 15+), valamint a ReactiveSwift könyvtár Apple platformokhoz való kötődés nélkül. A választás a minimálisan támogatott iOS verziótól és a fejlesztők tapasztalatától függ. Új iOS 15+ projektekhez a csapatok gyakran az AsyncSequence-t választják — nem igényel könyvtár telepítést és a Swift nyelv natív konstrukcióit használja.
Az RxSwift-tel használt architekturális minták általában az MVVM vagy a Clean Architecture irányelveit követik. A ViewModel Observable láncok formájában tartalmazza az összes üzleti logikát, a View feliratkozik a transzformált adatokra. Az Input-Output minta elválasztja a bemeneti eseményeket (érintés, szövegbevitel) és a kimeneti állapotokat (gomb szövege, loader láthatósága). Ez a megközelítés egyszerűsíti a tesztelést: a ViewModel virtuális Scheduler-eken keresztül UI nélkül tesztelhető.
Az RxSwift alkalmas mind néhány képernyős kis projektekhez, mind több tucat modullal rendelkező nagy enterprise alkalmazásokhoz. Nagy projektekben a reaktív láncok áthatják a teljes architektúrát: a UserDefaults megfigyelésétől RxProperty-n keresztül a Moya (RxSwift burkoló az Alamofire felett) hálózati kérésekig. Minden modul izolált és reaktív interfészeken keresztül kommunikál, ami leegyszerűsíti az implementáció cseréjét anélkül, hogy az előfizetőket módosítani kellene. Megfelelő architektúrával az RxSwift csökkenti a kód mennyiségét a klasszikus megközelítésekhez képest, mivel nem kell boilerplate kódot írni KVO-hoz, Target-Action-höz vagy NotificationCenter-hez.
Az RxSwift aktívan használatos az RxDataSources könyvtárral rendelkező projektekben — ez egy könyvtár a UITableView és UICollectionView reaktív kezeléséhez. Az RxDataSources automatikusan kiszámítja a különbséget a régi és új cellakészlet között, és animált változtatásokat alkalmaz. Ez megszabadítja a fejlesztőt a beginUpdates/endUpdates manuális kezelésétől és kiküszöböli az összeomlásokat adatinkonzisztencia esetén.
Az RxSwift láncok hibakereséséhez létezik a debug() operátor — naplózza az összes eseményt: subscribe, next, error, completed, dispose. Ez nélkülözhetetlen eszköz összetett reaktív csővezetékek fejlesztésénél. A debug(String) egy azonosítót fogad, amely megjelenik a naplókban. Memória profilozáshoz az RxSwift.Resources.total megmutatja az aktív Observable-ek és Disposable-ek teljes számát az alkalmazásban — segít észlelni a szivárgásokat, amikor a DisposeBag nincs kitakarítva vagy egy retain cycle tart fenn egy előfizetést. A kiegészítő takeUntil(self.rx.deallocated) operátor automatikusan lemondja az előfizetést az objektum felszabadításakor — ez egy újabb védelmi réteg a szivárgások ellen.
Az RxSwift kód írásakor fontos betartani az egy Observable egy előfizetés elvét: minden ViewController nem hozhat létre egynél több előfizetést egy Observable-re — ez csökkenti a versenyhelyzet kockázatát. Az Observable memoizálásához a share() operátort használják, amely a hideg Observable-t forróvá alakítja 1-es méretű replay pufferrel. Megosztott erőforrásokkal való munkánál használja a connect()-et a kibocsátás kezdetének kezeléséhez — ez garantálja, hogy minden előfizető csatlakozik az első esemény előtt.
Az RxSwift kód tesztelése TestScheduler-en keresztül történik — egy virtuális Scheduler, amely lehetővé teszi az idő kezelését. A testScheduler.createHotObservable(values) egy Observable-t hoz létre előre meghatározott eseménysorozattal virtuális idő szerint. A testScheduler.start() elindítja a feldolgozást. A TestScheduler lehetővé teszi az események sorrendjének és virtuális időbélyegének ellenőrzését valós késleltetések nélkül, ami gyors és determinisztikus teszteket eredményez.
Gyakran ismételt kérdések
Az Observable egy hideg forrás: nem bocsát ki eseményeket a feliratkozás előtt. A Subject forró: eseményeket bocsát ki az előfizetőktől függetlenül, és lehetővé teszi értékek kézi beszúrását az onNext segítségével. A PublishSubject csak új eseményeket továbbít, a BehaviorSubject — az utolsót plusz az újakat.
A DisposeBag tárolja az összes Disposable előfizetést. Amikor a DisposeBag felszabadításra kerül (például a ViewController bezárásakor), az összes tárolt előfizetés automatikusan törlődik. Ez garantálja, hogy az Observable többé nem küld eseményt egy már megsemmisült UI objektumnak.
Ha a minimális iOS verzió 13+ és a csapat ismeri a SwiftUI-t — válassza a Combine-t. Ha a projekt iOS 12 és alacsonyabb verziókat támogat, vagy nagyobb operátorkészletre van szükség — RxSwift. A Combine jobb integrációt biztosít a Foundation-nel (URLSession, Timer, NotificationCenter).
A Schedulers absztrahálja a végrehajtási szálakat. A subscribeOn megadja, hogy melyik Scheduler-en történjen a feliratkozás (általában background). Az observeOn meghatározza, hogy melyik Scheduler-en érkezzenek az események (gyakrabban MainScheduler UI frissítésekhez). A SerialDispatchQueueScheduler GCD-n keresztül működik.
Igen, az RxSwift integrálható a SwiftUI-val ObservableObject segítségével. Használja a BehaviorRelay-t @Published tulajdonságokként: a Relay-re való feliratkozás továbbítja a változásokat a Combine-nak, a SwiftUI pedig @ObservedObject-en keresztül újrarajzolja a View-t. Ez egy népszerű migrációs minta UIKit-ről SwiftUI-ra.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is