RxSwift — ano ito, mga kakayahan at reaktibong programming

May-akda: IT Sectr Nai-publish: 2026-05-03 Oras ng pagbabasa: 10 min

RxSwift ay isang library ng reaktibong programming para sa iOS na nagpapatupad ng pattern ng Observable at functional operators para sa pagtatrabaho sa mga asynchronous na daloy ng data. Nagpo-port ito ng mga konsepto ng ReactiveX (Rx) sa wikang Swift, na nagbibigay ng nag-iisang API para sa pagproseso ng mga kaganapan mula sa UI, mga network request, database, at timer. Ayon sa ReactiveX, 2025, ang library ay ginagamit sa higit 60,000 proyekto sa GitHub at nananatiling pamantayan ng reaktibong programming para sa Swift hanggang sa pagdating ng native na Combine. Pinapalitan ng RxSwift ang mga delegate, closure at notification ng nag-iisang chain ng pagproseso ng kaganapan.

Mga Pangunahing Punto

  • RxSwift — implementasyon ng ReactiveX para sa Swift, batay sa pattern ng Observable at mga chain ng operator
  • Observable — pinagmumulan ng mga asynchronous na kaganapan na maaaring magtapos nang matagumpay, may error, o walang katapusan
  • Subject — hybrid ng Observable at Observer na nagpapahintulot ng manu-manong pagpapadala ng mga kaganapan sa daloy
  • Schedulers namamahala kung saang thread isinasagawa ang subscription, pagmamasid, at pagproseso ng mga kaganapan
  • Mga Operator map, flatMap, filter, combineLatest nagbabago at nagsasama ng mga daloy nang walang race condition

Ano ang RxSwift?

RxSwift ay ang Swift port ng ReactiveX (Rx) library na ginawa ng Microsoft para sa .NET noong 2012. Ang pangunahing ideya ng Rx ay ipakita ang anumang asynchronous na pinagmumulan ng data bilang isang Observable sequence kung saan maaaring ilapat ang mga functional operator. Sa pag-develop ng iOS, ginagamit ang RxSwift para ikonekta ang mga kaganapan ng UI (pagpindot ng buton, pag-input ng teksto, mga kilos) sa lohika ng aplikasyon nang walang tahasang delegate at target-action.

Ang library ay binubuo ng tatlong module: RxSwift (core — Observable, Operator, Scheduler), RxCocoa (integrasyon sa UIKit — mga rx extension para sa UIButton, UITextField, UITableView) at RxRelay (Subject na walang terminal na kaganapan). Ang paghahati na ito ay nagpapahintulot sa paggamit ng core sa server Swift at mga test, at pagkonekta ng UI layer para lamang sa mga iOS application.

Ayon sa survey ng Stack Overflow, 2025, ang RxSwift ay nasa top 5 pinaka-ginagamit na third-party library para sa iOS. Ang pangunahing dahilan ng kasikatan ay ang pare-parehong pagproseso ng lahat ng asynchronous pattern: mga network request sa pamamagitan ng URLSession, mga animation sa pamamagitan ng UIViewPropertyAnimator, mga notification sa pamamagitan ng NotificationCenter at mga delegate sa pamamagitan ng DelegateProxy — lahat ay nababawasan sa Observable na may predictable na lifecycle.

Pilosopiya ng Reaktibong Programming

Reaktibong Programming ay isang paradigma kung saan ang programa ay tumutugon sa mga pagbabago ng data, hindi ito poll. Sa halip na isulat ang “kumuha ng data → iproseso → i-update ang UI”, inilalarawan ng developer ang isang chain ng pagbabago: “kapag nagbago ang data, ilapat ang filter, pagkatapos map, pagkatapos i-update ang UI”. Ipinapatupad ng RxSwift ang paradigma na ito sa pamamagitan ng Observable chain na may tamad na pagpapatupad — walang nangyayari hanggang lumitaw ang isang subscriber.

Mga Pangunahing Bahagi ng RxSwift: Observable, Subject, Disposable

Observable ay ang pundamental na uri ng RxSwift na kumakatawan sa isang sequence ng mga kaganapan sa oras. Ang Observable ay maaaring magpadala ng tatlong uri ng kaganapan: next (bagong halaga), error (error, nagtatapos ng daloy) at completed (matagumpay na pagkumpleto). Mayroong finite Observable (natatapos pagkatapos ipadala ang lahat ng halaga) at infinite Observable (hal. mga kaganapan ng UI — hindi natatapos).

Lifecycle ng Observable

Lifecycle ng Observable ay may tatlong yugto: paglikha (create, just, from), pagbabago (mga operator map, filter, flatMap) at subscription (subscribe). Kung walang subscription, hindi nagsasagawa ng anumang aksyon ang Observable — ito ay isang tamad na sequence. Pagkatapos ng subscription, magsisimulang magpadala ang Observable ng mga kaganapan sa subscriber hanggang sa matapos ito o kanselahin ng subscriber ang subscription sa pamamagitan ng Disposable.

swift
import RxSwift

// Paglikha ng Observable mula sa array
let numbers = Observable.from([1, 2, 3, 4, 5])

// Pagbabago sa pamamagitan ng operator
let squared = numbers
    .filter { $0 % 2 == 0 }
    .map { $0 * $0 }

// Subscription na may paghawak ng kaganapan
let disposable = squared
    .subscribe(onNext: { print($0) },
               onError: { print("Error: \($0)") },
               onCompleted: { print("Done") })

Subject ay isang uri na parehong Observable (maaaring mag-subscribe) at Observer (maaaring magpadala ng mga kaganapan). Nagbibigay ang RxSwift ng apat na uri ng Subject: PublishSubject (bagong kaganapan lamang), BehaviorSubject (may paunang halaga), ReplaySubject (buffering ng huling N kaganapan) at AsyncSubject (huling halaga lamang bago matapos). Ang Subject ay maginhawa para sa integrasyon ng imperatibong code (closure, delegate) sa reaktibong chain.

Disposable ay isang token ng pagkansela ng subscription. Kapag ayaw na ng subscriber na makatanggap ng mga kaganapan, tinatawag niya ang disposable.dispose(). Sa praktika, ginagamit ang DisposeBag: isang koleksyon ng Disposable na awtomatikong nagkakansela ng lahat ng subscription sa deinitialization ng may-ari (hal. UIViewController). Pinipigilan nito ang pagtagas ng memory na hindi maiiwasan sa manual na pamamahala ng mga subscription.

Uri ng SubjectPaunang halagaInuulit sa subscriberGamit
PublishSubjectHindiBagong kaganapan lamangMga kaganapan sa UI, madalang na notification
BehaviorSubjectOoHuli + bagoEstado, daloy ng data
ReplaySubjectHindiBuffer N + bagoPag-cache ng kasaysayan
AsyncSubjectHindiHuli lamangMga gawaing computational
PublishRelayHindiBago lamangWalang error/completed

Mga Operator ng Pagbabago at Pagsala ng Daloy

Mga Operator ng RxSwift ay mga function na kumukuha ng isang Observable at nagbabalik ng isa pang Observable, binabago ang daloy ng data. Sa pamamagitan ng pagsasama ng mga operator, bumubuo ang developer ng mga deklaratibong chain ng pagproseso nang walang intermediate variable at race condition. Lahat ng operator ay tamad: ang chain ay binuo sa paglalarawan at isinasagawa sa subscription.

Mga Operator ng Pagbabago ay nagbabago ng bawat kaganapan sa daloy. naglalapat ng function sa bawat elemento, binubuksan ng flatMap ang Observable mula sa bawat elemento sa isang patag na daloy, iniipon ng scan ang intermediate na resulta (katulad ng reduce, ngunit may emisyon ng bawat hakbang). buffer naggrupo ng mga elemento ayon sa oras o dami, window naghahati ng daloy sa nested Observable ayon sa mga window.

swift
// Halimbawa ng chain ng operator: paghahanap na may debounce
searchTextField.rx.text
    .orEmpty
    .debounce(.milliseconds(300), scheduler: MainScheduler.instance)
    .distinctUntilChanged()
    .flatMapLatest { query -> Observable<[String]> in
        return apiService.search(query)
    }
    .bind(to: tableView.rx.items(cellIdentifier: "Cell")) { _, item, cell in
        cell.textLabel?.text = item
    }
    .disposed(by: disposeBag)

Mga Operator ng Pagsala ay nagpapadaan lamang ng mga kaganapan na nakakatugon sa kondisyon. filter naghihiwalay ayon sa predicate, distinctUntilChanged nagpapadaan lamang ng mga halaga na iba sa nauna, take at takeWhile naglilimita ng bilang ng mga kaganapan. skip at skipWhile lumalaktaw sa unang N kaganapan o mga kaganapan hanggang sa matugunan ang kondisyon. Para sa paghawak ng error, ginagamit ang catchError (pagsalo at pagpapalit) at retry (pag-uulit ng sequence sa error).

Mga Operator ng Pagsasama ay nagsasama ng maraming Observable sa isa. pinagsasama ng combineLatest ang huling halaga mula sa maraming daloy sa isang tuple, pinagsasama ng zip ang mga elemento nang pares na may parehong index, pinagsasama ng merge ang maraming daloy sa isa ayon sa pagkakasunod-sunod ng pagdating ng mga kaganapan. withLatestFrom pinagsasama ang isang kaganapan mula sa pangunahing daloy sa huling halaga mula sa ibang daloy — maginhawa para sa mga kaganapan ng UI na may kasalukuyang estado.

KategoryaOperatorGinagawa
PagbabagomapBinabago ang bawat halaga sa pamamagitan ng function
PagbabagoflatMapBinuksan ang nested Observable sa patag na daloy
PagsalafilterNagpapadaan ng mga halaga ayon sa predicate
PagsaladistinctUntilChangedNagpapadaan lamang ng mga binagong halaga
PagsasamacombineLatestPinagsasama ang huling halaga mula 2+ daloy
PagsasamazipPinagsasama ang mga elemento nang pares ayon sa index
PamamahaladebounceInaantala ang mga kaganapan hanggang sa pause sa daloy
PamamahalatakeKumuha ng unang N kaganapan at tinatapos ang daloy

Schedulers at Pamamahala ng Thread ng Pagpapatupad

Scheduler sa RxSwift ay isang abstraction sa ibabaw ng thread ng pagpapatupad (o queue). Tinutukoy ng Scheduler kung saang thread isinasagawa ang paglikha ng kaganapan, pagbabago at subscription. Hindi tulad ng GCD kung saan tahasang itinuturo ng developer ang DispatchQueue, gumagamit ang RxSwift ng dalawang parameter: subscribeOn (kung saang thread isinasagawa ang Observable) at observeOn (kung saang thread tinatawag ang subscriber).

MainScheduler at BackgroundScheduler

MainScheduler ay nagpapatupad ng code sa pangunahing thread — sapilitan para sa pag-update ng UIKit (lahat ng pagbabago sa UI ay dapat mangyari sa main thread). Binalot ng SerialDispatchQueueScheduler ang sequential GCD queue, ConcurrentDispatchQueueScheduler — parallel queue. Para sa mga gawain sa background, ginagamit ang ConcurrentDispatchQueueScheduler na may qos: .background o .utility.

swift
// Karaniwang pattern: background work + UI sa main
apiService.fetchData()
    .subscribeOn(ConcurrentDispatchQueueScheduler(qos: .background))
    .observeOn(MainScheduler.instance)
    .subscribe(onNext: { data in
        self.tableView.reloadData()
        self.loadingIndicator.stopAnimating()
    })
    .disposed(by: disposeBag)

Ang tamang paggamit ng Scheduler ay pumipigil sa pag-block ng UI sa mga network request at mabibigat na kalkulasyon. Ang subscribeOn ay nakakaapekto sa buong upstream (lahat ng operator hanggang observeOn ay isinasagawa sa tinukoy na scheduler). Ang observeOn ay lumilipat ng downstream — lahat ng operator pagkatapos ng observeOn ay isinasagawa sa tinukoy na scheduler. Sa chain ay maaaring maraming observeOn para sa paglipat sa pagitan ng mga thread sa iba't ibang yugto ng pagbabago.

Praktikal na Aplikasyon ng RxSwift sa iOS

RxSwift sa mga proyekto ng iOS ay pinakamadalas ginagamit para sa pagkonekta ng UI sa data sa pamamagitan ng reaktibong chain. Nagbibigay ang RxCocoa ng mga rx extension para sa lahat ng standard na UIKit component: rx.tap para sa UIButton, rx.text para sa UITextField, rx.selectedRow para sa UIPickerView. Pinapayagan nito ang pagpapalit ng @IBAction at mga delegate ng mga deklaratibong subscription.

RxSwift sa Kombinasyon sa MVVM

MVVM (Model-View-ViewModel) ay isang pattern ng arkitektura kung saan ang ViewModel ay namamahala ng estado at lohika ng negosyo, at ang View ay nag-subscribe sa mga reaktibong property ng ViewModel. Perpektong akma ang RxSwift sa MVVM: Ang ViewModel ay nag-publish ng Observable o Driver para sa data, ang View ay nag-subscribe sa kanila sa pamamagitan ng bind. Ang ViewModel ay walang referensya sa View — nagbabalik ito ng Observable na kinokonsumo ng View.

swift
class LoginViewModel {
    let email = BehaviorRelay<String>(value: "")
    let password = BehaviorRelay<String>(value: "")

    var isFormValid: Observable<Bool> {
        return Observable
            .combineLatest(email, password) {
                !$0.isEmpty && $0.contains("@") && $1.count >= 6
            }
    }
}

// Sa ViewController:
viewModel.isFormValid
    .bind(to: loginButton.rx.isEnabled)
    .disposed(by: disposeBag)

Mga network request — pangalawang pinakamadalas na lugar ng aplikasyon ng RxSwift. Binalot ng URLSession.rx.response ang HTTP request sa Observable na nagbabalik ng (response, data) sa tagumpay o error sa pagkabigo. Sa kombinasyon sa Codable at operator na map, nakakakuha tayo ng isang compact na reaktibong API layer: Observable<MyModel> na walang callback at paghawak ng error sa bawat method. Sa error ng network, ang operator na retry(3) ay awtomatikong umuulit ng request nang tatlong beses na may exponential delay.

RxSwift vs Combine

Combine ay isang native na framework ng Apple, ipinakilala sa iOS 13. Nilulutas nito ang parehong mga gawain tulad ng RxSwift: pagtatrabaho sa mga asynchronous na kaganapan sa pamamagitan ng Publisher, Subscriber at operator. Ngunit ang Combine ay may mga pangunahing pagkakaiba: mahigpit na pag-type ng error sa pamamagitan ng Failure type, built-in na suporta para sa Swift Concurrency (async/await) at integrasyon sa SwiftUI sa pamamagitan ng @Published at ObservableObject.

RxSwift ay nananalo sa backward compatibility — sumusuporta sa iOS 8+, samantalang ang Combine ay nangangailangan ng iOS 13+. Ang RxSwift ay may mas mayamang ecosystem ng third-party extension (RxDataSources, RxGesture, RxAnimated) at detalyadong dokumentasyon ng mga operator. Para sa mga proyektong sumusuporta sa lumang bersyon ng iOS, ang RxSwift ay nananatiling tanging pagpipilian.

Para sa mga bagong proyekto na may iOS 13+, inirerekomenda ng Apple ang Combine. Ito ay malapit na isinama sa SwiftUI, may mas maliit na binary size at opisyal na suporta. Gayunpaman, ang pag-migrate ng umiiral na RxSwift code sa Combine ay nangangailangan ng pag-rewrite ng lahat ng Observable → Publisher, at ang ecosystem ng RxCocoa ay walang kumpletong katumbas sa Combine — ang UIKit ay walang native na Publisher para sa lahat ng UI component.

KatangianRxSwiftCombine
Pinakamababang iOSiOS 8+iOS 13+
Uri ng errorError (anumang)Generic Failure
Extension ng UIRxCocoa (UIKit, AppKit)@Published (SwiftUI)
Mga Operator400+ operator~100 operator
Swift ConcurrencySa pamamagitan ng bridgeNative na suporta
StatusThird-partyOpisyal ng Apple

Mga Madalas Itanong

Ano ang pagkakaiba ng Observable at Subject sa RxSwift?

Observable ay pinagmumulan ng kaganapan na may tamad na pagpapatupad. Ang Subject ay parehong Observable at Observer — maaari kang mag-subscribe dito at magpadala ng mga bagong kaganapan nang manu-mano. Ang Subject ay maginhawa para sa integrasyon ng imperatibong code sa mga reaktibong chain.

Kailan gagamitin ang RxSwift sa halip na Combine?

RxSwift ay pinipili kapag kailangan ang suporta ng iOS 11-12, may umiiral na RxSwift codebase, o may pangangailangan para sa mayamang ecosystem ng operator (400+ vs ~100 sa Combine). Para sa mga bagong proyekto sa iOS 13+ mas mainam ang Combine.

Ano ang DisposeBag at para saan ito?

DisposeBag ay isang koleksyon ng mga Disposable token na awtomatikong nagkakansela ng lahat ng subscription sa deinitialization ng may-ari. Kung walang DisposeBag, ang subscription ay lumilikha ng malakas na referensya sa closure, na nagdudulot ng pagtagas ng memory kapag nawasak ang UIViewController.

Paano hawakan ang mga error sa RxSwift?

Gamitin ang catchError para palitan ang error ng default na halaga, retry para muling isagawa ang Observable, materialize para gawing kaganapan ang error. Sa UI layer, ang Driver at Signal ay hindi nagpapadala ng mga error — sila ay pinangangasiwaan nang internal.

Paano naiiba ang Driver sa Observable sa RxCocoa?

Driver ay isang espesyal na uri ng Observable na nag-gagarantiya ng pagpapatupad sa MainScheduler, kawalan ng error at pagbabahagi ng resources. Ginagarantiya ng Driver na ang mga update sa UI ay nangyayari sa pangunahing thread. Ang Observable ay hindi nagbibigay ng gayong mga garantiya — kinakailangan ang observeOn.

Buod

  • RxSwift — library ng reaktibong programming para sa iOS na nagpapatupad ng Observable pattern at 400+ operator ng pagbabago
  • Observable, Subject, Disposable — tatlong pundamental na uri na bumubuo sa batayan ng lahat ng reaktibong chain
  • Mga Operator map, flatMap, filter, combineLatest, debounce ay nagpapahintulot sa pagbuo ng mga deklaratibong chain nang walang race condition
  • Schedulers (subscribeOn / observeOn) namamahala ng mga thread ng pagpapatupad, pumipigil sa pag-block ng UI
  • RxCocoa nagbibigay ng mga rx extension para sa UIKit, pinapalitan ang mga delegate at target-action ng mga reaktibong subscription
  • Combine — native na alternatibo mula sa Apple para sa iOS 13+, ngunit ang RxSwift ay nananatiling may kaugnayan para sa mas lumang bersyon

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din