Jadi sekarang dengan cepat, orang-orang ReactiveCocoa telah menulis ulang dalam versi 3.0 untuk cepat
Juga, ada proyek lain yang disebut RxSwift .
Saya bertanya-tanya apakah orang dapat menambahkan informasi tentang apa perbedaan dalam desain / api / filosofi dari dua kerangka kerja (tolong, dalam semangat SO, tetap berpegang pada hal-hal yang benar, daripada pendapat tentang yang "terbaik")
[Catatan untuk mod StackOverflow: Pertanyaan ini TIDAK memiliki jawaban pasti, jawabannya adalah perbedaan antara dua kerangka kerja. Saya pikir itu juga sangat pada topik untuk SO]
Untuk memulai, kesan awal saya dari membaca ReadMe mereka adalah:
- Sebagai seseorang yang akrab dengan C # Rx "nyata" dari microsoft, RxSwift terlihat jauh lebih dikenal.
- ReactiveCococa tampaknya telah pergi ke ruang sendiri sekarang, memperkenalkan abstraksi baru seperti Sinyal vs SignalProducers dan Lifting. Di satu sisi ini sepertinya memperjelas beberapa situasi (apa itu sinyal Panas vs Dingin) tetapi di sisi lain ini tampaknya menambah kompleksitas kerangka kerja BANYAK
swift
reactive-programming
rx-swift
reactive-cocoa-3
Orion Edwards
sumber
sumber
Jawaban:
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 :
Sekarang saatnya untuk hal-hal teknologi.
Memproduksi / Mengamati Entitas
RAC 3.0 memiliki 2 entitas utama,
Signal
danSignalProducer
, yang pertama menerbitkan acara terlepas dari pelanggan terpasang atau tidak, yang kedua mengharuskanstart
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
danSignalProducer
diterjemahkan keObservable
, itu bisa terdengar membingungkan, tetapi 2 entitas ini sebenarnya hal yang sama di dunia Rx. Sebuah desain denganObservable
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 aSignal
dibuang sebelum acara penyelesaian telah dikirim. Untuk rekap keduanya memiliki jenis acara berikut:Next
, untuk menghitung nilai yang diterima baruError
, untuk menghitung kesalahan dan menyelesaikan streaming, berhenti berlangganan semua pengamatComplete
, untuk menandai aliran sebagai selesai, berhenti berlangganan semua pengamatRAC juga telah
interrupted
dikirim ketikaSignal
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 untukObservable
di RxSwift. Untuk mengubahSignal
/SignalProducer
menjadi entitas yang dapat ditulis, Anda harus menggunakanpipe()
fungsi untuk mengembalikan item yang dikontrol secara manual. Di ruang Rx, ini adalah jenis yang berbeda yang disebutSubject
.Jika konsep baca / tulis terdengar asing, analogi yang bagus dengan
Future
/Promise
dapat dibuat. AFuture
adalah placeholder hanya-baca, sepertiSignal
/SignalProducer
danObservable
, di sisi lain, aPromise
dapat dipenuhi secara manual, seperti untukpipe()
danSubject
.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 dariSubject
danObservable
dengan operator yang sama, tanpa perhatian ekstra.Di ruang RAC,
Signal
danSignalProducer
ada 2 entitas yang berbeda dan kita haruslift
diSignalProducer
dapat menulis apa yang diproduksi dengan contohSignal
. 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:
Tambahan
RAC juga memiliki konsep
Action
danProperty
, 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 yangAction
diterjemahkan lagi menjadiObservable
, ini ditunjukkan dengan baikRxCocoa
, integrasi primitif Rx untuk iOS dan Mac. RACProperty
dapat diterjemahkan ke dalamVariable
(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.
sumber
NoError
) pada tipe stream itu sendiri:Signal<T, E: ErrorType>
versusObservable<T>
. Ini, serta pemisahan panas / dingin, memberikan peningkatan jumlah informasi pada waktu kompilasi yang tidak Anda milikiRxSwift
.