RxSwift adalah pustaka pemrograman reaktif untuk Swift yang mengimplementasikan pola Observable. Menurut data ReactiveX, 2025, ini adalah implementasi Reactive Extensions paling populer untuk ekosistem Apple. Observable bertindak sebagai sumber peristiwa, dan Observer berlangganan untuk menerimanya.
Poin Utama
RxSwift adalah pustaka pemrograman reaktif untuk bahasa Swift, yang di-porting dari Reactive Extensions (Rx). Pustaka ini memungkinkan pendeskripsian program asinkron dan berbasis peristiwa melalui Observable Sequence — urutan data yang tersedia dari waktu ke waktu. Pengembang iOS menggunakan RxSwift untuk menangani permintaan jaringan, peristiwa UI, dan data streaming tanpa callback bersarang.
Dasar RxSwift terdiri dari dua protokol kunci: ObservableType — sumber peristiwa yang dapat memancarkan tiga jenis sinyal: .next(value), .error(error), dan .completed. Observer berlangganan ke Observable melalui metode subscribe dan menerima peristiwa ini. Model ini disebut Reactive Streams dan menjamin bahwa tidak ada peristiwa yang hilang dengan langganan yang benar.
RxSwift menyediakan lebih dari 300 operator untuk bekerja dengan aliran: map mengubah setiap peristiwa, filter hanya melewatkan yang cocok, flatMap membuka Observable bersarang menjadi satu aliran. Operator digabungkan menjadi rantai, menciptakan pipeline pemrosesan data deklaratif tanpa efek samping.
Selain Observable dasar, RxSwift menyediakan tipe wrapper khusus. Single memancarkan tepat satu nilai atau kesalahan — ideal untuk permintaan HTTP. Completable berakhir dengan sukses atau kesalahan tanpa nilai — untuk operasi penulisan. Maybe menggabungkan kedua skenario: dapat berakhir dengan nilai, tanpa nilai, atau dengan kesalahan. Traits ini menyederhanakan semantik dan membuat kode menjadi self-documenting.
Pemrograman reaktif di RxSwift dibangun di atas pola Observer. ObservableSequence adalah analog dari Sequence dari pustaka standar, tetapi dengan akses asinkron ke elemen. Aliran peristiwa ditransmisikan melalui rantai operator, yang masing-masing mengembalikan ObservableSequence baru tanpa mengubah yang asli.
Operator di RxSwift adalah fungsi murni yang menerima satu ObservableSequence dan mengembalikan yang baru. Misalnya, map membuat urutan baru dengan menerapkan transformasi ke setiap elemen. Dengan menggabungkan operator, pengembang membangun pipeline di mana data melewati semua tahap pemrosesan tanpa variabel perantara.
Schedulers adalah abstraksi atas utas eksekusi di RxSwift. Scheduler menentukan di utas mana kode akan dieksekusi: MainScheduler — utas UI, SerialDispatchQueueScheduler — antrian latar belakang. Operator subscribeOn dan observeOn menentukan di mana pekerjaan dilakukan dan di mana hasilnya diproses.
RxSwift mencakup beberapa tipe dasar, yang masing-masing menyelesaikan tugasnya dalam pipeline reaktif. Single — Observable yang memancarkan tepat satu nilai atau kesalahan, nyaman untuk permintaan jaringan. Completable berakhir dengan sukses atau kesalahan tanpa nilai. Maybe menggabungkan properti Single dan Completable.
Subject adalah Observable panas yang sekaligus bertindak sebagai Observer. PublishSubject hanya memancarkan peristiwa baru kepada pelanggan, BehaviorSubject — peristiwa terakhir plus yang baru. Relay adalah varian Subject yang tidak memancarkan .error atau .completed, menjamin kelangsungan aliran. BehaviorRelay menyimpan nilai saat ini dan cocok untuk State-driven UI.
DisposeBag adalah kumpulan Disposable yang secara otomatis membatalkan semua langganan saat dealokasi. Di iOS, DisposeBag biasanya ditambahkan ke UIViewController atau UIView. Saat layar ditutup, DisposeBag dibersihkan — ini mencegah kebocoran memori dan referensi ke elemen UI yang tidak ada.
Di bawah ini ditunjukkan contoh pembuatan Observable dari array data menggunakan operator map untuk mengubah string:
let observable = Observable.of("Swift", "RxSwift", "Reactive")
observable
.map { $0.uppercased() }
.subscribe(onNext: { value in
print("Diterima: \(value)")
})
.disposed(by: disposeBag)
Contoh kedua mendemonstrasikan penggabungan dua permintaan jaringan menggunakan zip — operator menunggu hingga kedua Observable memancarkan nilai dan menggabungkan hasilnya dalam tuple:
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)
Contoh ketiga menunjukkan penggunaan BehaviorRelay untuk menyimpan status dan memperbarui UI secara otomatis saat perubahan: setiap perubahan state.accept() segera ditransmisikan ke pelanggan, yang ideal untuk pola State dalam arsitektur MVVM.
let state = BehaviorRelay(value: "idle")
state
.subscribe(onNext: { status in
print("Status: \(status)")
})
.disposed(by: disposeBag)
state.accept("loading") // Akan menampilkan: Status: loading
RxSwift berbeda dari metode asinkron tradisional (Delegation, NotificationCenter, Callback) dalam hal deklaratif dan komposabilitas. Tidak seperti Combine, RxSwift mendukung iOS 9+ dan memiliki lebih banyak operator. Namun, Combine terintegrasi ke dalam Foundation dan SwiftUI di tingkat bahasa, yang memberinya keunggulan dalam proyek Apple baru.
Keunggulan utama RxSwift dibandingkan GCD (Grand Central Dispatch) — kemampuan untuk menggabungkan dan mengubah aliran data di tingkat abstraksi, bukan mengelola antrian secara manual. Pada saat yang sama, RxSwift memerlukan pembelajaran konsep pendekatan reaktif, yang meningkatkan hambatan masuk bagi tim.
Dalam praktiknya, RxSwift digunakan dalam proyek besar di mana rantai reaktif menghubungkan peristiwa UI, logika bisnis, dan interaksi jaringan dalam satu pipeline. Misalnya, dalam aplikasi trading, aliran kuotasi diproses melalui RxSwift: tick datang dari WebSocket, melewati filtrasi, dikelompokkan berdasarkan kerangka waktu, dan ditampilkan pada grafik secara real-time. Skenario seperti itu sulit diimplementasikan melalui Delegation atau NotificationCenter tanpa kehilangan keterbacaan.
Alternatif RxSwift termasuk Combine (iOS 13+), AsyncSequence dari Swift Concurrency (iOS 15+), serta pustaka pihak ketiga ReactiveSwift tanpa keterikatan pada platform Apple. Pilihan tergantung pada versi iOS minimum yang didukung dan pengalaman pengembang. Untuk proyek baru iOS 15+, tim sering memilih AsyncSequence — tidak memerlukan instalasi pustaka dan menggunakan konstruksi bahasa Swift asli.
Pola arsitektur dengan RxSwift biasanya mengikuti MVVM atau Clean Architecture. ViewModel berisi semua logika bisnis dalam bentuk rantai Observable, View berlangganan data yang telah ditransformasi. Pola Input-Output memisahkan peristiwa input (sentuhan, input teks) dan status output (teks tombol, visibilitas loader). Pendekatan ini menyederhanakan pengujian: ViewModel diuji tanpa UI melalui Scheduler virtual.
RxSwift cocok untuk proyek kecil dengan beberapa layar maupun aplikasi enterprise besar dengan puluhan modul. Dalam proyek besar, rantai reaktif menembus seluruh arsitektur: dari pengamatan UserDefaults melalui RxProperty hingga permintaan jaringan melalui Moya (pembungkus RxSwift di atas Alamofire). Setiap modul terisolasi dan berkomunikasi melalui antarmuka reaktif, yang menyederhanakan penggantian implementasi tanpa mengubah pelanggan. Dengan arsitektur yang benar, RxSwift mengurangi jumlah kode dibandingkan pendekatan klasik, karena tidak perlu menulis boilerplate untuk KVO, Target-Action, atau NotificationCenter.
RxSwift secara aktif digunakan dalam proyek dengan RxDataSources — pustaka untuk bekerja secara reaktif dengan UITableView dan UICollectionView. RxDataSources secara otomatis menghitung perbedaan antara kumpulan sel lama dan baru serta menerapkan perubahan animasi. Ini membebaskan pengembang dari pekerjaan manual dengan beginUpdates/endUpdates dan menghilangkan crash saat ketidakcocokan data.
Untuk debugging rantai RxSwift, terdapat operator debug() — ia mencatat semua peristiwa: subscribe, next, error, completed, dispose. Ini adalah alat yang sangat diperlukan saat mengembangkan pipeline reaktif yang kompleks. debug(String) menerima pengenal yang ditampilkan di log. Untuk pembuatan profil memori, RxSwift.Resources.total menunjukkan jumlah total Observable dan Disposable aktif dalam aplikasi — membantu mendeteksi kebocoran saat DisposeBag tidak dibersihkan atau retain cycle mempertahankan langganan. Operator tambahan takeUntil(self.rx.deallocated) secara otomatis membatalkan langganan saat dealokasi objek — ini adalah lapisan perlindungan lain terhadap kebocoran.
Saat menulis kode RxSwift, penting untuk mematuhi prinsip satu Observable per langganan: setiap ViewController tidak boleh membuat lebih dari satu langganan ke satu Observable — ini mengurangi risiko race condition. Untuk memoisasi Observable, digunakan operator share(), yang mengubah Observable dingin menjadi panas dengan buffer replay ukuran 1. Saat bekerja dengan sumber daya bersama, gunakan connect() untuk mengelola awal emisi — ini menjamin semua pelanggan terhubung sebelum peristiwa pertama.
Pengujian kode RxSwift dilakukan melalui TestScheduler — Scheduler virtual yang memungkinkan pengelolaan waktu. testScheduler.createHotObservable(values) membuat Observable dengan urutan peristiwa yang telah ditentukan berdasarkan waktu virtual. testScheduler.start() memulai pemrosesan. TestScheduler memungkinkan pemeriksaan urutan dan stempel waktu virtual terjadinya peristiwa tanpa penundaan nyata, yang membuat pengujian cepat dan deterministik.
Pertanyaan yang Sering Diajukan
Observable adalah sumber dingin: tidak memancarkan peristiwa hingga berlangganan. Subject panas: memancarkan peristiwa terlepas dari pelanggan dan memungkinkan penyisipan nilai secara manual melalui onNext. PublishSubject hanya mentransmisikan peristiwa baru, BehaviorSubject — yang terakhir plus yang baru.
DisposeBag menyimpan semua langganan Disposable. Ketika DisposeBag didealokasi (misalnya, saat ViewController ditutup), semua langganan yang disimpan secara otomatis dibatalkan. Ini menjamin bahwa Observable tidak akan lagi mengirim peristiwa ke objek UI yang sudah dihancurkan.
Jika versi minimum iOS 13+ dan tim mengenal SwiftUI — pilih Combine. Jika proyek mendukung iOS 12 dan lebih rendah atau membutuhkan set operator yang lebih besar — RxSwift. Combine memberikan integrasi yang lebih baik dengan Foundation (URLSession, Timer, NotificationCenter).
Schedulers mengabstraksi utas eksekusi. subscribeOn menunjukkan di Scheduler mana langganan dilakukan (biasanya background). observeOn menentukan di Scheduler mana peristiwa diterima (lebih sering MainScheduler untuk pembaruan UI). SerialDispatchQueueScheduler bekerja melalui GCD.
Ya, RxSwift dapat diintegrasikan dengan SwiftUI melalui ObservableObject. Gunakan BehaviorRelay sebagai properti @Published: langganan ke Relay mentransmisikan perubahan ke Combine, dan SwiftUI menggambar ulang View melalui @ObservedObject. Ini adalah pola migrasi populer dari UIKit ke SwiftUI.
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga