RxSwift — ce este, concepte cheie și programare reactivă

Autor: IT Sectr Publicat: 2026-03-17 Timp de citire: 8 min

RxSwift este o bibliotecă de programare reactivă pentru Swift, care implementează modelul Observable. Conform datelor ReactiveX, 2025, este cea mai populară implementare a Reactive Extensions pentru ecosistemul Apple. Observable acționează ca sursă de evenimente, iar Observer se abonează pentru a le primi.

Principalele puncte

  • RxSwift — implementare a Reactive Extensions pentru Swift cu suport pentru Observable, Subject și 300+ operatori
  • Observable — sursă de evenimente care emite valori, erori sau semnal de finalizare
  • Subject — simultan Observable și Observer, permite inserarea manuală a evenimentelor în flux
  • DisposeBag — mecanism automat de gestionare a memoriei care anulează abonamentele la dezalocare
  • Schedulers — gestionează firele de execuție, permițând comutarea între cozile main și background

Ce este RxSwift?

RxSwift este o bibliotecă de programare reactivă pentru limbajul Swift, portată din Reactive Extensions (Rx). Permite descrierea programelor asincrone și orientate pe evenimente prin Observable Sequence — o secvență de date disponibile în timp. Dezvoltatorii iOS folosesc RxSwift pentru gestionarea solicitărilor de rețea, evenimentelor UI și datelor în flux fără callback-uri imbricate.

Observable și Observer

Baza RxSwift o constituie două protocoale cheie: ObservableType — sursa de evenimente care poate emite trei tipuri de semnale: .next(value), .error(error) și .completed. Observer se abonează la Observable prin metoda subscribe și primește aceste evenimente. Acest model se numește Reactive Streams și garantează că niciun eveniment nu se pierde cu o abonare corectă.

Operatori de transformare

RxSwift oferă peste 300 de operatori pentru lucrul cu fluxurile: map transformă fiecare eveniment, filter lasă să treacă doar potrivitele, flatMap desface Observable-urile imbricate într-un singur flux. Operatorii se combină în lanțuri, creând un pipeline declarativ de procesare a datelor fără efecte secundare.

Traits: Single, Completable, Maybe

Pe lângă Observable de bază, RxSwift oferă tipuri wrapper specializate. Single emite exact o valoare sau o eroare — ideal pentru cereri HTTP. Completable se termină cu succes sau eroare fără valoare — pentru operații de scriere. Maybe combină ambele scenarii: se poate termina cu valoare, fără valoare sau cu eroare. Aceste Traits simplifică semantica și fac codul auto-documentat.

Cum funcționează programarea reactivă în RxSwift

Programarea reactivă în RxSwift se bazează pe modelul Observer. ObservableSequence este analogul Sequence din biblioteca standard, dar cu acces asincron la elemente. Fluxul de evenimente este transmis printr-un lanț de operatori, fiecare returnând o nouă ObservableSequence fără a o modifica pe cea originală.

Lanțuri de operatori

Operatorii în RxSwift sunt funcții pure care primesc o ObservableSequence și returnează una nouă. De exemplu, map creează o nouă secvență aplicând transformarea fiecărui element. Combinând operatorii, dezvoltatorul construiește un pipeline în care datele trec prin toate etapele de procesare fără variabile intermediare.

Schedulers și fire de execuție

Schedulers este o abstractizare peste firele de execuție în RxSwift. Scheduler determină pe ce fir se execută codul: MainScheduler — firul UI, SerialDispatchQueueScheduler — coada de fundal. Operatorii subscribeOn și observeOn specifică unde se execută munca și unde se procesează rezultatele.

Componentele principale RxSwift

RxSwift include mai multe tipuri de bază, fiecare rezolvând propria sarcină în pipeline-ul reactiv. Single — Observable care emite exact o valoare sau o eroare, convenabil pentru cereri de rețea. Completable se termină cu succes sau eroare fără valoare. Maybe combină proprietățile Single și Completable.

Subject și Relay

Subject este un Observable fierbinte care acționează simultan ca Observer. PublishSubject emite doar evenimente noi abonaților, BehaviorSubject — ultimul eveniment plus cele noi. Relay este o variantă de Subject care nu emite .error sau .completed, garantând continuitatea fluxului. BehaviorRelay stochează valoarea curentă și este potrivit pentru UI bazat pe stare.

DisposeBag

DisposeBag este o colecție de Disposable care anulează automat toate abonamentele la propria dezalocare. În iOS, DisposeBag este de obicei adăugat la UIViewController sau UIView. La închiderea ecranului, DisposeBag este curățat — acest lucru previne scurgerile de memorie și referințele la elemente UI inexistente.

Exemple de cod RxSwift

Mai jos este un exemplu de creare a unui Observable dintr-un array de date folosind operatorul map pentru transformarea șirurilor:

swift
let observable = Observable.of("Swift", "RxSwift", "Reactive")

observable
    .map { $0.uppercased() }
    .subscribe(onNext: { value in
        print("Primit: \(value)")
    })
    .disposed(by: disposeBag)

În al doilea exemplu se demonstrează combinarea a două cereri de rețea cu ajutorul zip — operatorul așteaptă ca ambele Observable să emită o valoare și combină rezultatele într-un tuplu:

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)

Al treilea exemplu arată utilizarea BehaviorRelay pentru stocarea stării și actualizarea automată a UI la modificări: fiecare schimbare state.accept() este transmisă imediat abonaților, ceea ce este ideal pentru modelele State în arhitectura MVVM.

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

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

state.accept("loading") // Va afișa: Status: loading

RxSwift vs alte abordări

RxSwift se deosebește de metodele tradiționale de asincronizare (Delegation, NotificationCenter, Callback) prin declarativitate și compozabilitate. Spre deosebire de Combine, RxSwift suportă iOS 9+ și are mai mulți operatori. Totuși, Combine este integrat în Foundation și SwiftUI la nivel de limbaj, ceea ce îi oferă un avantaj în proiectele noi Apple.

Principalul avantaj al RxSwift față de GCD (Grand Central Dispatch) — posibilitatea de a combina și transforma fluxuri de date la nivel de abstractizare, nu de a gestiona manual cozile. În același timp, RxSwift necesită învățarea conceptelor abordării reactive, ceea ce crește pragul de intrare pentru echipă.

În practică, RxSwift este utilizat în proiecte mari unde lanțurile reactive leagă evenimentele UI, logica de afaceri și interacțiunile de rețea într-un singur pipeline. De exemplu, în aplicațiile de tranzacționare, fluxurile de cotații sunt procesate prin RxSwift: tick-urile vin din WebSocket, trec prin filtrare, se grupează pe timeframe și sunt afișate pe grafic în timp real. Un astfel de scenariu este greu de realizat prin Delegation sau NotificationCenter fără pierderea lizibilității.

Alternativele la RxSwift includ Combine (iOS 13+), AsyncSequence din Swift Concurrency (iOS 15+), precum și biblioteca terță ReactiveSwift fără legătură cu platformele Apple. Alegerea depinde de versiunea minimă suportată iOS și de experiența dezvoltatorilor. Pentru proiecte noi iOS 15+, echipele aleg adesea AsyncSequence — nu necesită instalarea de biblioteci și folosește construcții native ale limbajului Swift.

Modelele arhitecturale cu RxSwift urmează de obicei MVVM sau Clean Architecture. ViewModel conține toată logica de afaceri sub formă de lanțuri Observable, View se abonează la datele transformate. Modelul Input-Output separă evenimentele de intrare (atingeri, introducere text) și stările de ieșire (textul butonului, vizibilitatea loader-ului). Această abordare simplifică testarea: ViewModel este testat fără UI prin Scheduler-i virtuali.

RxSwift se potrivește atât pentru proiecte mici cu câteva ecrane, cât și pentru aplicații enterprise mari cu zeci de module. În proiecte mari, lanțurile reactive străbat întreaga arhitectură: de la observarea UserDefaults prin RxProperty până la cererile de rețea prin Moya (wrapper RxSwift peste Alamofire). Fiecare modul este izolat și comunică prin interfețe reactive, ceea ce simplifică înlocuirea implementării fără a modifica abonații. Cu o arhitectură corectă, RxSwift reduce cantitatea de cod comparativ cu abordările clasice, deoarece nu este nevoie să scrii boilerplate pentru KVO, Target-Action sau NotificationCenter.

RxSwift este utilizat activ în proiecte cu RxDataSources — o bibliotecă pentru lucrul reactiv cu UITableView și UICollectionView. RxDataSources calculează automat diferența dintre setul vechi și cel nou de celule și aplică modificări animate. Acest lucru îl eliberează pe dezvoltator de munca manuală cu beginUpdates/endUpdates și elimină crash-urile la nepotrivirea datelor.

Pentru depanarea lanțurilor RxSwift există operatorul debug() — înregistrează toate evenimentele: subscribe, next, error, completed, dispose. Este un instrument indispensabil la dezvoltarea pipeline-urilor reactive complexe. debug(String) primește un identificator care se afișează în loguri. Pentru profilarea memoriei, RxSwift.Resources.total arată numărul total de Observable și Disposable active în aplicație — ajută la detectarea scurgerilor când DisposeBag nu este curățat sau un retain cycle menține abonarea. Operatorul suplimentar takeUntil(self.rx.deallocated) anulează automat abonarea la dezalocarea obiectului — acesta este un alt strat de protecție împotriva scurgerilor.

Cele mai bune practici RxSwift

La scrierea codului RxSwift este important să se respecte principiul un Observable per abonare: fiecare ViewController nu trebuie să creeze mai mult de o abonare la un Observable — aceasta reduce riscul de race condition. Pentru memoizarea Observable se folosește operatorul share(), care transformă un Observable rece în unul fierbinte cu un buffer replay de dimensiune 1. La lucrul cu resurse partajate, folosiți connect() pentru gestionarea începerii emisiei — garantează că toți abonații se conectează înainte de primul eveniment.

Testarea codului RxSwift se realizează prin TestScheduler — un Scheduler virtual care permite gestionarea timpului. testScheduler.createHotObservable(values) creează un Observable cu o secvență predefinită de evenimente după timpul virtual. testScheduler.start() pornește procesarea. TestScheduler permite verificarea ordinii și timestamp-ului virtual la care apar evenimentele, fără întârzieri reale, ceea ce face testele rapide și deterministe.

Întrebări frecvente

Care este diferența dintre Observable și Subject în RxSwift?

Observable este o sursă rece: nu emite evenimente până la abonare. Subject este fierbinte: emite evenimente independent de abonați și permite inserarea manuală a valorilor prin onNext. PublishSubject transmite doar evenimente noi, BehaviorSubject — ultimul plus cele noi.

Cum previne DisposeBag scurgerile de memorie în RxSwift?

DisposeBag stochează toate abonamentele Disposable. Când DisposeBag este dezalocat (de exemplu, la închiderea ViewController), toate abonamentele stocate sunt anulate automat. Aceasta garantează că Observable nu va mai trimite un eveniment unui obiect UI deja distrus.

Ce să alegi: RxSwift sau Combine într-un proiect iOS nou?

Dacă versiunea minimă iOS 13+ și echipa cunoaște SwiftUI — alegeți Combine. Dacă proiectul suportă iOS 12 și mai jos sau necesită un set mai mare de operatori — RxSwift. Combine oferă o integrare mai bună cu Foundation (URLSession, Timer, NotificationCenter).

Cum funcționează Schedulers în RxSwift?

Schedulers abstractizează firele de execuție. subscribeOn indică pe ce Scheduler se execută abonarea (de obicei background). observeOn determină pe ce Scheduler se primesc evenimentele (mai des MainScheduler pentru actualizări UI). SerialDispatchQueueScheduler funcționează prin GCD.

Se poate folosi RxSwift cu SwiftUI?

Da, RxSwift poate fi integrat cu SwiftUI prin ObservableObject. Folosiți BehaviorRelay ca proprietăți @Published: abonarea la Relay transmite modificările către Combine, iar SwiftUI redesenează View prin @ObservedObject. Acesta este un model popular de migrare de la UIKit la SwiftUI.

Concluzii

  • RxSwift — bibliotecă de programare reactivă bazată pe Reactive Extensions și modelul Observable
  • Observable emite trei tipuri de semnale: .next, .error și .completed
  • Subject (PublishSubject, BehaviorSubject) combină Observable și Observer pentru fluxuri fierbinți
  • DisposeBag gestionează ciclul de viață al abonamentelor și previne scurgerile de memorie
  • Operatorii (map, filter, flatMap, zip) permit construirea de lanțuri declarative de procesare
  • Schedulers comută execuția între cozile de fundal și firul UI
  • Pentru dezvoltare nouă pe iOS 13+, luați în considerare Combine ca alternativă încorporată

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și