Swiftでは、 ReactiveCocoa がSwiftのバージョン3.0で書き直されました
また、 RxSwift と呼ばれる別のプロジェクトがスピンアップされました。
2つのフレームワークのデザイン/ API /哲学の違いについての情報を人々が追加できるのではないかと思います(SOの精神で、どちらが「ベスト」であるかという意見ではなく、真実であることに固執してください)
[StackOverflow MODに関する注意:この質問には明確な答えがあります。答えは2つのフレームワークの違いです。 SOのトピックでも非常に高いと思います]
はじめに、彼らのReadMeを読んだときの最初の印象は次のとおりです。
これは非常に良い質問です。 2つの世界を比較するのは非常に困難です。 Rxは、Reactive ExtensionsがC#、Java、JSなどの他の言語にあるものの移植版です。
Reactive CocoaはFunctional Reactive Programmingに触発されましたが、ここ数か月ではReactive Extensionsに触発されたとしても指摘されています。結果は、Rxといくつかのものを共有するフレームワークですが、FRPに由来する名前を持っています。
最初に言いたいのは、RACもRxSwiftも、コンセプトの Conalの定義 に従ってFunctional Reactive Programming実装ではないということです。この時点から、すべてを、各フレームワークが副作用や他のいくつかのコンポーネントを処理する方法に減らすことができます。
コミュニティとmeta-tech stuffについて話しましょう。
これで、技術スタッフの時間です。
RAC 3.0には2つの主要なエンティティ、Signal
name__とSignalProducer
name__があり、最初のエンティティはサブスクライバが接続されているかどうかに関係なくイベントを発行し、2番目のエンティティは実際にシグナル/イベントを生成するためにstart
name__を必要とします。この設計は、多くの開発者にとって混乱の原因となっている、ホットオブザーバブルとコールドオブザーバブルの退屈な概念を分離するために作成されました。これが、差異を副作用の管理方法に減らすことができる理由です。
RxSwiftでは、Signal
name__およびSignalProducer
name__はObservable
name__に変換されますが、紛らわしいかもしれませんが、これら2つのエンティティは実際にはRxの世界では同じものです。 RxSwiftでObservable
name__sを含むデザインは、ホットかコールドかを考慮して作成する必要がありますが、不必要な複雑さのように聞こえるかもしれませんが、それらがどのように機能するかを理解すると)彼らは飼いならすことができます。
両方の世界で、サブスクリプションの概念は基本的に同じです。RACが導入した小さな違いが1つあり、完了イベントが送信される前にinterruption
name__が破棄されるときにSignal
name__イベントになります。両方を要約すると、次の種類のイベントがあります。
Next
name__、新しい受信値を計算するためError
name__、エラーを計算してストリームを完了し、すべてのオブザーバーをサブスクライブ解除するComplete
name__、すべてのオブザーバーのサブスクライブ解除を完了したストリームとしてマークするさらに、RACにはinterrupted
name__があり、これはSignal
name__が正しく完了するかエラーで終了する前に破棄されるときに送信されます。
RACでは、Signal
name __/SignalProducer
name__は読み取り専用エンティティであり、外部から管理することはできません。RxSwiftのObservable
name__も同じです。 Signal
name __/SignalProducer
name__を書き込み可能なエンティティにするには、pipe()
関数を使用して手動で制御されたアイテムを返す必要があります。 Rxスペースでは、これはSubject
name__と呼ばれる異なるタイプです。
読み取り/書き込みの概念になじみがない場合は、Future
name __/Promise
name__との素敵な類推ができます。 Future
name__は、Signal
name __/SignalProducer
name__やObservable
name__などの読み取り専用のプレースホルダーです。一方、pipe()
やPromise
name__のように、Subject
name__は手動で実行できます。
このエンティティは、両方の世界で同じ概念ですが、RACはシリアルのみであり、代わりにRxSwift機能は同時スケジューラも備えています。
構成は、リアクティブプログラミングの重要な機能です。ストリームの構成は、両方のフレームワークの本質です。RxSwiftでは、ストリームはsequencesとも呼ばれます。
RxSwiftのすべてのオブザーバブルエンティティはObservableType
name__型であるため、Subject
name__およびObservable
name__のインスタンスを、同じ演算子で追加の心配なしに構成します。
RAC空間では、Signal
name__とSignalProducer
name__は2つの異なるエンティティであり、lift
name__のインスタンスで生成されるものを作成できるようにするには、SignalProducer
name__のSignal
name__を使用する必要があります。 2つのエンティティには独自の演算子があるため、物事を混合する必要がある場合は、特定の演算子が利用可能であることを確認する必要があります。反対側では、ホット/コールドオブザーバブルを忘れます。
この部分について、 Colin Eberhardt はうまくまとめています:
現在のAPIを見ると、シグナル操作は主に「次の」イベントに焦点を当てており、異なるスレッドで値の変換、スキップ、遅延、結合、観察を行うことができます。一方、シグナルプロデューサーAPIは、then、flatMap、takeUntil、catchなどの操作に関連するシグナルライフサイクルイベント(完了、エラー)に主に関係しています。
RACにはAction
name__およびProperty
name__の概念もあります。前者は主にユーザーの相互作用に関連する副作用を計算するタイプです。後者は、値が変化したときにタスクを実行するために値を観察する場合に興味深いです。 RxSwiftでは、Action
name__は再びObservable
name__に変換されます。これは、iOSとMacの両方のRxプリミティブの統合であるRxCocoa
name__にうまく示されています。 RACのProperty
name__は、RxSwiftでVariable
name__(またはBehaviourSubject
name__)に変換できます。
Property
name __/Variable
name__は、命令型の世界をリアクティブプログラミングの宣言的な性質に橋渡しするための方法であるため、サードパーティのライブラリやiOS/Macスペースのコア機能を扱う際の基本的なコンポーネントである場合があることを理解することが重要です。
RACとRxSwiftは2つの完全に異なる獣であり、前者はCocoaスペースで長い歴史を持ち、多くの貢献者がいます。後者はかなり若いですが、Java、JSまたは他の言語で効果的であることが証明された概念に依存しています。ネット。どちらの方が良いかは、好みによります。 RACは、観測可能なホット/コールドの分離が必要であり、それがフレームワークのコア機能であると述べています。RxSwiftは、それらの統合は分離よりも優れていると言います。これも副作用の管理/実行方法に関するものです。
RAC 3.0は、割り込みの概念、2つのエンティティ間の演算子の分割、信号の生成を開始するstart
name__などの命令型動作の導入など、ホット/コールドオブザーバブルを分離するという主要な目標に加えて、予期しない複雑さを導入したようです。一部の人々にとっては、これらのことはナイスなものであり、キラー機能でさえあります。もう1つ覚えておくべきことは、RACはCocoaの慣習に可能な限り対応しようとしていることです。したがって、経験豊富なCocoa Devであれば、should RxSwiftよりも快適に作業できます。
一方、RxSwiftは、Reactive Extensionsのホット/コールドオブザーバブルなどのすべての欠点だけでなく、良い面も備えています。 RxJS、RxJava、またはRx.NetからRxSwiftへの移行は単純なことです。すべての概念は同じであるため、資料を見つけることは非常に興味深いものになります。プラットフォームを考慮して再適用できます。
どちらを選ぶかは間違いなく好みの問題であり、客観的な観点からどちらが優れているかを判断することは不可能です。唯一の方法は、Xcodeを起動し、両方を試して、より快適に作業できるものを選択することです。それらは、ソフトウェア開発の簡素化という同じ目標を達成しようとする、同様の概念の2つの実装です。