Mengenal dasar RxSwift

Mengenal dasar RxSwift

Sepengalaman saya selama melakukan iOS programming sebelum ke Jakarta, saya hanya mengenal Completion Handler untuk menangani proses asynchronous seperti proses pemanggilan API. Itu adalah satu-satunya teknik yang dikenalkan kepada saya dan teman saya yang lain saat mempelajari iOS programming.

Kalau prosesnya tidak banyak sih masih syukur, masih gampang dibaca dan di maintain. Tapi kalau udah menyangkut beberapa proses, sudah mulai kewalahan. Contoh saya pernah ketemu kasus dimana UI nya di update jika dan hanya jika 2 request API tertentu sudah selesai. Kalau dulu saya handle nya membentuk chaining request untuk 2 API tersebut. Jadi kalau request pertama selesai baru manggil request kedua dan bila request kedua selesai barulah saya memperbaharui UI nya. Yep, simple minded dan mungkin ada cara yang lain namun saya hanya terpikir cara itu yang paling gampang dan straight forward.

Namun saat saya mulai bekerja di Jakarta, saya cukup bingung awalnya karena dalam project iOS yang dibangun tidak memakai Completion Handler secara langsung melainkan menggunakan library yang namanya RxSwift. Disinilah saya mulai mengenal RxSwift, ibarat namanya mengenal hal-hal baru awalnya saya kesulitan memahami bagaimana cara kerjanya dan merasa RxSwift sangat merepotkan dan membingungkan.

Tapi seperti kata pepatah “Tak kenal maka tak sayang”, jadi saya mencoba mengenal lebih dekat apa itu RxSwift dengan bantuan teammate.

Lalu sekarang, saya sudah jauh lebih memahami RxSwift dibanding saya yang dulu. Bahkan saya sangat senang menggunakannya dan bisa dibilang merasa sering dimanjakan oleh RxSwift karena fitur-fiturnya yang sangat membantu dalam menulis kode yang deklaratif untuk menangani proses asynchronous dan lainnya. Namun seperti yang saya tulis sebelumnya, butuh waktu dan tenaga untuk memahaminya agar bisa mengapresiasi RxSwift. Saya juga sadar bahwa ada orang di luar sana seperti saya dulu yang belum begitu mengenal dan memahami apa itu RxSwift.

Pada suatu ketika, saya pernah menyebut RxSwift dan menanyakan pendapat temen saya mengenainya saat lagi hangout bareng. Dia merespon seperti ini “Ohh iya, saya pernah coba, RxSwift itu yang ini kan...(menjelaskan apa yang dia tau)” dan diakhiri “Tapi saya tidak begitu mengerti sih bagaimana cara pakainya”.

Dari penjelasannya saya sadar, bahwa dia tidak begitu memahami cara kerja RxSwift dan apa tujuan RxSwift itu dibuat. Saya pun membuat tulisan ini dan berharap semoga tulisan ini dapat dicerna cukup mudah sehingga anda yang membaca tulisan ini bisa lebih mengenal RxSwift di jalan yang benar. Namun yang saya bahas di sini hanya basic concept dari RxSwift.

Jadi apa itu RxSwift ?

Tadi sudah saya singgung sedikit di atas bahwa RxSwift itu adalah library yang membantu kita dalam mengatur penanganan proses asynchronous. Sesuai dengan namanya, library tersebut digunakan dalam bahasa pemograman Swift. Dia ini anaknya Rx, nah kalau mau tahu Rx itu apa bisa dibaca sendiri ya soalnya terlalu panjang kalau mau saya bahas dalam tulisan ini.

Dalam RxSwift, ada 2 object yang akan selalu kita temukan di setiap proses yaitu Observable dan Observer. Observable ini perannya sebagai source yang memberikan data dengan cara seperti memancarkan sinyal. Sedangkan Observer berperan untuk menangkap sinyal tersebut sehingga bisa mendapatkan data dari si Observable.

Bila digambarkan dengan cara lain, cara kerjanya seperti di aplikasi Medium ini. Misal anda mem-follow akun saya di Medium maka anda telah membentuk sebuah Observer. Sedangkan akun saya di Medium menjadi Observable. Saat saya memposting tulisan baru, maka anda akan mendapat notifikasi dari Medium mengenai tulisan baru saya. Notifikasi berisi informasi tulisan baru saya itu adalah contoh data yang dipancarkan seperti sinyal. Selama anda masih mem-follow saya, bila saya memposting tulisan baru lagi, anda akan mendapat notifikasi yang baru lagi juga.

Kalau begitu cara kerjanya, apakah cara kerja unfollow akun Medium juga berarti Observer berhenti menangkap sinyal dari Observable ? Jawabannya BENAR dan TEPAT sekali !! Seperti sistem follow dan unfollow di Medium, anda bisa memilih untuk tidak lagi menangkap sinyal dari sebuah Observable yakni dengan cara membuang Observer tersebut atau term-nya itu di dispose. Bila tidak di dispose maka nanti object-nya akan tetap hidup di memori dan menyebabkan memory leak.

Contoh Observable dan Observer

Berikut saya berikan contoh dalam bentuk kode sampel mengenai penggunaan RxSwift.

Hal pertama yang paling jelas dan paling penting adalah tentunya meng-import si RxSwift biar fitur-fiturnya bisa dipakai di file tersebut. Dalam contoh struct TitleProvider di atas dapat di lihat bahwa saya membuat sebuah Observable bila fungsi getCurrentTitle dipanggil.

Di dalam block ada implementasi request API. Di dalam Completion Handler nya saya menggunakan fungsi onNext untuk melempar datanya kepada Observer. Bila terjadi error saya juga melempar error tersebut kepada Observer menggunakan fungsi onError. Kita perlu mengembalikan object Disposables agar Observer nantinya dapat di dispose untuk berhenti menerima data dari Observable ini.

Lalu pada TitleReceiver saya membuat Observer saat fungsi setupCurrentTitle dipanggil. Dapat dilihat bahwa saya melakukan subscribe pada Observable hasil dari fungsi getCurrentTitle. Lalu saya mengisi 2 block yang ada di sana yaitu onNext untuk mengolah data yang diterima dan onError untuk menangani error yang terjadi.

Sebenarnya ada lagi dua block tambahan secara default namun juga optional yaitu onCompleted yang dipanggil bila menerima sinyal onCompleted dari Observable dan onDisposed yang dipanggil bila Observer telah ke dispose. Cuma untuk onCompleted dan onDisposed sangat jarang saya pakai jadi tidak saya cantumkan pada contoh biar lebih fokus pada hal yang lebih sering dipakai. Bila onCompleted atau onError kepanggil maka Observer akan otomatis men-dispose diri sendiri.

Mungkin ada yang berpikir kalau misalnya perlu melakukan subscribe pada beberapa Observable apakah jadi harus membuat dan memegang beberapa variabel Disposable di dalam suatu object ?

Tenang karena RxSwift menyediakan alternatif untuk keadaan seperti itu yakni dengan menggunakan DisposeBag. Pada setiap Observable yang di subscribe, panggil fungsi disposed(by:) dan masukkan object DisposeBag yang telah dipegang di object parent pada fungsi tersebut. DisposeBag akan memegang semua Disposable yang telah didaftarkan menggunakan fungsi tersebut dan bila object yang memegang DisposeBag telah hilang dari memori maka DisposeBag akan secara otomatis men-dispose semua Disposable yang dia pegang sehingga tidak terjadi memory leak. Berikut contoh penggunaan DisposeBag.

Untuk satu proses saja mungkin belum kelihatan efeknya, namun bayangkan bila sekian banyak proses Completion Handler yang ada di project anda diganti dengan style seperti ini, kode anda menjadi lebih deklaratif dan lebih mudah dibaca. Anda tidak perlu khawatir nama argumen pada Completion Handler tidak sama atau deklarasi argumen error yang optional yang harus anda tangani karena tidak ingin mengotori kode di bagian depan bila tidak diperlukan. Dengan menggunakan RxSwift, kode anda menjadi lebih rapi dan deklaratif.

Penutup

Bagaimana sampai disini ? Apakah mampu memahami implementasi minimal dari RxSwift ? Apa yang saya tulis di atas baru sebagian kecil dari sekian banyak kemampuan RxSwift yang sebenarnya. Banyak lagi fitur-fitur menarik dan sangat membantu dari RxSwift bila anda ingin mempelajari lebih lanjut seperti penggunaan zip, drive, combineLatest, dll. Tapi yah harus memahami dasarnya dulu baru bisa mencoba yang lebih advanced biar tidak pusing nantinya.

Awalnya saya ingin menulis banyak hal namun karena saya tidak mau tulisan ini terlalu panjang, jadi saya akhiri dulu di sini. Mungkin pada tulisan berikutnya baru akan saya bahas yang lebih dalam, dengan asumsi sudah pada mengerti konsep dasar RxSwift bila ada yang tertarik. Kalau ingin membaca sendiri dokumentasinya bisa coba dibaca di sumbernya langsung.

Bila ada feedback atau kritik ataupun koreksi bisa disampaikan dengan menulis respon di bawah ini.

Terima kasih telah meluangkan waktu anda yang berharga untuk membaca tulisan sederhana ini.

Stay awesome and see you next time !! :)