Ini pertanyaan yang sangat bagus. Membandingkan dua dunia itu sangat sulit. Rx adalah port dari apa ekstensi reaktif dalam bahasa lain seperti C #, Java atau JS.
Kakao Reaktif diilhami oleh Pemrograman Reaktif Fungsional , tetapi dalam beberapa bulan terakhir, juga telah ditunjuk sebagai terinspirasi oleh Ekstensi Reaktif . Hasilnya adalah kerangka kerja yang berbagi beberapa hal dengan Rx, tetapi memiliki nama dengan asal di FRP.
Hal pertama yang saya katakan adalah bahwa baik RAC maupun RxSwift bukanlah implementasi Pemrograman Reaktif Fungsional , menurut definisi konsep Conal . Dari titik ini semuanya dapat direduksi menjadi bagaimana setiap kerangka kerja menangani efek samping dan beberapa komponen lainnya.
Mari kita bicara tentang komunitas dan hal - hal meta-tech :
- RAC adalah proyek berusia 3 tahun, lahir di Objective-C yang kemudian diangkut ke Swift (dengan jembatan) untuk rilis 3.0, setelah sepenuhnya menghentikan pekerjaan yang sedang berlangsung di Objective-C.
- RxSwift adalah proyek lama beberapa bulan dan tampaknya memiliki momentum di komunitas saat ini. Satu hal yang penting untuk RxSwift adalah bahwa berada di bawah organisasi ReactiveX dan bahwa semua implementasi lainnya bekerja dengan cara yang sama, belajar bagaimana menangani RxSwift akan membuat bekerja dengan Rx.Net, RxJava atau RxJS tugas sederhana dan hanya masalah sintaks bahasa. Bisa dibilang filosofi belajar sekali, berlaku di mana-mana .
Sekarang saatnya untuk hal-hal teknologi.
Memproduksi / Mengamati Entitas
RAC 3.0 memiliki 2 entitas utama, Signal
dan SignalProducer
, yang pertama menerbitkan acara terlepas dari pelanggan terpasang atau tidak, yang kedua mengharuskan start
untuk benar-benar memiliki sinyal / acara yang dihasilkan. Desain ini telah dibuat untuk memisahkan konsep membosankan dari panas dan dingin yang dapat diamati, yang telah menjadi sumber kebingungan bagi banyak pengembang. Inilah sebabnya mengapa perbedaan dapat dikurangi menjadi bagaimana mereka mengelola efek samping .
Dalam RxSwift, Signal
dan SignalProducer
diterjemahkan ke Observable
, itu bisa terdengar membingungkan, tetapi 2 entitas ini sebenarnya hal yang sama di dunia Rx. Sebuah desain dengan Observable
s dalam RxSwift harus dibuat mempertimbangkan apakah mereka panas atau dingin, itu bisa terdengar sebagai kompleksitas yang tidak perlu, tetapi begitu Anda mengerti bagaimana mereka bekerja (dan lagi panas / dingin / hangat hanya tentang efek samping saat berlangganan / mengamati ) mereka dapat dijinakkan.
Di kedua dunia, konsep berlangganan pada dasarnya sama, ada satu perbedaan kecil yang diperkenalkan RAC dan adalah interruption
peristiwa ketika a Signal
dibuang sebelum acara penyelesaian telah dikirim. Untuk rekap keduanya memiliki jenis acara berikut:
Next
, untuk menghitung nilai yang diterima baru
Error
, untuk menghitung kesalahan dan menyelesaikan streaming, berhenti berlangganan semua pengamat
Complete
, untuk menandai aliran sebagai selesai, berhenti berlangganan semua pengamat
RAC juga telah interrupted
dikirim ketika Signal
dibuang sebelum menyelesaikan dengan benar atau dengan kesalahan.
Menulis Secara Manual
Dalam RAC, Signal
/ SignalProducer
adalah entitas read-only, mereka tidak dapat dikelola dari luar, hal yang sama untuk Observable
di RxSwift. Untuk mengubah Signal
/ SignalProducer
menjadi entitas yang dapat ditulis, Anda harus menggunakan pipe()
fungsi untuk mengembalikan item yang dikontrol secara manual. Di ruang Rx, ini adalah jenis yang berbeda yang disebut Subject
.
Jika konsep baca / tulis terdengar asing, analogi yang bagus dengan Future
/ Promise
dapat dibuat. A Future
adalah placeholder hanya-baca, seperti Signal
/ SignalProducer
dan Observable
, di sisi lain, a Promise
dapat dipenuhi secara manual, seperti untuk pipe()
dan Subject
.
Penjadwal
Entitas ini cukup mirip di kedua dunia, konsep yang sama, tetapi RAC bersifat serial saja, sebaliknya fitur RxSwift juga penjadwal bersamaan.
Komposisi
Komposisi adalah fitur utama dari Pemrograman Reaktif. Menyusun stream adalah esensi dari kedua framework, dalam RxSwift, mereka juga disebut urutan .
Semua entitas yang dapat diamati dalam RxSwift adalah tipe ObservableType
, jadi kami membuat instance dari Subject
dan Observable
dengan operator yang sama, tanpa perhatian ekstra.
Di ruang RAC, Signal
dan SignalProducer
ada 2 entitas yang berbeda dan kita haruslift
di SignalProducer
dapat menulis apa yang diproduksi dengan contoh Signal
. Kedua entitas memiliki operator sendiri, jadi ketika Anda perlu mencampur hal-hal, Anda harus memastikan operator tertentu tersedia, di sisi lain Anda lupa tentang panas / dingin yang bisa diamati.
Tentang bagian ini, Colin Eberhardt menyimpulkannya dengan baik:
Melihat API saat ini, operasi sinyal terutama difokuskan pada acara 'berikutnya', yang memungkinkan Anda untuk mengubah nilai, melewati, menunda, menggabungkan, dan mengamati pada utas yang berbeda. Sedangkan API penghasil sinyal sebagian besar berkaitan dengan peristiwa siklus hidup sinyal (selesai, kesalahan), dengan operasi termasuk kemudian, flatMap, takeUntil dan catch.
Tambahan
RAC juga memiliki konsep Action
dan Property
, yang pertama adalah tipe untuk menghitung efek samping, terutama yang berkaitan dengan interaksi pengguna, yang terakhir menarik ketika mengamati nilai untuk melakukan tugas ketika nilai telah berubah. Di RxSwift yang Action
diterjemahkan lagi menjadi Observable
, ini ditunjukkan dengan baik RxCocoa
, integrasi primitif Rx untuk iOS dan Mac. RAC Property
dapat diterjemahkan ke dalam Variable
(atauBehaviourSubject
) di RxSwift.
Penting untuk memahami bahwa Property
/Variable
adalah cara kita harus menjembatani dunia imperatif dengan sifat deklaratif Pemrograman Reaktif, jadi kadang-kadang merupakan komponen mendasar ketika berhadapan dengan perpustakaan pihak ketiga atau fungsi inti ruang iOS / Mac.
Kesimpulan
RAC dan RxSwift adalah 2 binatang buas yang berbeda, yang pertama memiliki sejarah panjang di ruang Kakao dan banyak kontributor, yang terakhir ini cukup muda, tetapi bergantung pada konsep yang telah terbukti efektif dalam bahasa lain seperti Jawa, JS atau .BERSIH. Keputusan yang lebih baik adalah pada preferensi. RAC menyatakan bahwa pemisahan panas / dingin dapat diobservasi diperlukan dan itu adalah fitur inti dari kerangka kerja, RxSwift mengatakan bahwa penyatuan mereka lebih baik daripada pemisahan, sekali lagi ini hanya tentang bagaimana efek samping dikelola / dilakukan.
RAC 3.0 tampaknya telah memperkenalkan beberapa kerumitan tak terduga di atas tujuan utama memisahkan panas / dingin yang dapat diamati, seperti konsep interupsi, membelah operator antara 2 entitas dan memperkenalkan beberapa perilaku penting seperti start
mulai memproduksi sinyal. Bagi sebagian orang hal-hal ini bisa menjadi hal yang baik untuk dimiliki atau bahkan fitur pembunuh, bagi sebagian orang lainnya hal-hal itu bisa saja tidak perlu atau bahkan berbahaya. Hal lain yang perlu diingat adalah bahwa RAC berusaha mengikuti konvensi Kakao sebanyak mungkin, jadi jika Anda seorang Kakao yang berpengalaman, Anda harus merasa lebih nyaman untuk bekerja dengannya daripada RxSwift.
RxSwift di sisi lain hidup dengan semua kerugian seperti panas / dingin yang dapat diamati, tetapi juga hal-hal baik, dari Reactive Extensions. Pindah dari RxJS, RxJava atau Rx.Net ke RxSwift adalah hal yang sederhana, semua konsepnya sama, jadi ini membuat bahan temuan cukup menarik, mungkin masalah yang sama yang Anda hadapi sekarang, telah diselesaikan oleh seseorang di RxJava dan solusinya dapat diterapkan kembali dengan mempertimbangkan platform.
Yang mana yang harus dipilih pasti masalah preferensi, dari perspektif objektif tidak mungkin untuk mengatakan mana yang lebih baik. Satu-satunya cara adalah menjalankan Xcode dan mencoba keduanya dan memilih salah satu yang terasa lebih nyaman untuk dikerjakan. Mereka adalah 2 implementasi dari konsep yang sama, mencoba untuk mencapai tujuan yang sama: menyederhanakan pengembangan perangkat lunak.