RxSwift — apa itu, konsep kunci dan pemrograman reaktif

Penulis: IT Sectr Diterbitkan: 2026-03-17 Waktu membaca: 8 mnt

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 — implementasi Reactive Extensions untuk Swift dengan dukungan Observable, Subject, dan 300+ operator
  • Observable — sumber peristiwa yang memancarkan nilai, kesalahan, atau sinyal penyelesaian
  • Subject — sekaligus Observable dan Observer, memungkinkan penyisipan peristiwa secara manual ke dalam aliran
  • DisposeBag — mekanisme manajemen memori otomatis yang membatalkan langganan saat dealokasi
  • Schedulers — mengelola utas eksekusi, memungkinkan perpindahan antara antrian main dan background

Apa itu RxSwift?

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.

Observable dan Observer

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.

Operator transformasi

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.

Traits: Single, Completable, Maybe

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.

Bagaimana cara kerja pemrograman reaktif di RxSwift

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.

Rantai operator

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 dan utas eksekusi

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.

Komponen utama RxSwift

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

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

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.

Contoh kode RxSwift

Di bawah ini ditunjukkan contoh pembuatan Observable dari array data menggunakan operator map untuk mengubah string:

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

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)

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.

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

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

state.accept("loading") // Akan menampilkan: Status: loading

RxSwift vs pendekatan lain

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.

Praktik terbaik RxSwift

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

Apa perbedaan antara Observable dan Subject di RxSwift?

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.

Bagaimana DisposeBag mencegah kebocoran memori di RxSwift?

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.

Apa yang harus dipilih: RxSwift atau Combine dalam proyek iOS baru?

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

Bagaimana cara kerja Schedulers di RxSwift?

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.

Bisakah RxSwift digunakan dengan SwiftUI?

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

  • RxSwift — pustaka pemrograman reaktif berdasarkan Reactive Extensions dan pola Observable
  • Observable memancarkan tiga jenis sinyal: .next, .error, dan .completed
  • Subject (PublishSubject, BehaviorSubject) menggabungkan Observable dan Observer untuk aliran panas
  • DisposeBag mengelola siklus hidup langganan dan mencegah kebocoran memori
  • Operator (map, filter, flatMap, zip) memungkinkan pembangunan rantai pemrosesan deklaratif
  • Schedulers mengalihkan eksekusi antara antrian latar belakang dan utas UI
  • Untuk pengembangan baru di iOS 13+, pertimbangkan Combine sebagai alternatif bawaan

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.

Diskusikan proyek

Baca juga