web-dev-qa-db-ja.com

ReactiveCocoa対RxSwift-長所と短所?

Swiftでは、 ReactiveCocoa がSwiftのバージョン3.0で書き直されました

また、 RxSwift と呼ばれる別のプロジェクトがスピンアップされました。

2つのフレームワークのデザイン/ API /哲学の違いについての情報を人々が追加できるのではないかと思います(SOの精神で、どちらが「ベスト」であるかという意見ではなく、真実であることに固執してください)

[StackOverflow MODに関する注意:この質問には明確な答えがあります。答えは2つのフレームワークの違いです。 SOのトピックでも非常に高いと思います]

はじめに、彼らのReadMeを読んだときの最初の印象は次のとおりです。

  • Microsoftの「本物の」C#Rxに精通している人として、RxSwiftはずっと認識しやすいように見えます。
  • ReactiveCococaは今では独自のスペースに移り、Signals vs SignalProducersやLiftingなどの新しい抽象概念を導入しているようです。一方で、これはいくつかの状況(ホットvsコールドシグナルとは何か)を明確にしているように見えますが、一方で、これはフレームワークの複雑さを増加させているようです
243
Orion Edwards

これは非常に良い質問です。 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年前のプロジェクトであり、Objective-Cで生まれたプロジェクトは、Objective-Cで進行中の作業を完全に廃止した後、3.0リリースでSwift(ブリッジ付き)に移植されました。
  • RxSwiftは数ヶ月前のプロジェクトであり、現在、コミュニティに勢いがあるようです。 RxSwiftにとって重要なことの1つは、 ReactiveX 組織の下にあり、他のすべての実装が同じように機能していることです。RxSwiftを処理する方法を学ぶと、Rx.Net、RxJava、またはRxJS単純なタスクと言語構文の問題。私はそれが哲学に基づいていると言うことができます一度学び、どこにでも適用

これで、技術スタッフの時間です。

エンティティの生成/観察

RAC 3.0には2つの主要なエンティティ、Signalname__とSignalProducername__があり、最初のエンティティはサブスクライバが接続されているかどうかに関係なくイベントを発行し、2番目のエンティティは実際にシグナル/イベントを生成するためにstartname__を必要とします。この設計は、多くの開発者にとって混乱の原因となっている、ホットオブザーバブルとコールドオブザーバブルの退屈な概念を分離するために作成されました。これが、差異を副作用の管理方法に減らすことができる理由です。

RxSwiftでは、Signalname__およびSignalProducername__はObservablename__に変換されますが、紛らわしいかもしれませんが、これら2つのエンティティは実際にはRxの世界では同じものです。 RxSwiftでObservablename__sを含むデザインは、ホットかコールドかを考慮して作成する必要がありますが、不必要な複雑さのように聞こえるかもしれませんが、それらがどのように機能するかを理解すると)彼らは飼いならすことができます。

両方の世界で、サブスクリプションの概念は基本的に同じです。RACが導入した小さな違いが1つあり、完了イベントが送信される前にinterruptionname__が破棄されるときにSignalname__イベントになります。両方を要約すると、次の種類のイベントがあります。

  • Nextname__、新しい受信値を計算するため
  • Errorname__、エラーを計算してストリームを完了し、すべてのオブザーバーをサブスクライブ解除する
  • Completename__、すべてのオブザーバーのサブスクライブ解除を完了したストリームとしてマークする

さらに、RACにはinterruptedname__があり、これはSignalname__が正しく完了するかエラーで終了する前に破棄されるときに送信されます。

手動で書く

RACでは、Signalname __/SignalProducername__は読み取り専用エンティティであり、外部から管理することはできません。RxSwiftのObservablename__も同じです。 Signalname __/SignalProducername__を書き込み可能なエンティティにするには、pipe()関数を使用して手動で制御されたアイテムを返す必要があります。 Rxスペースでは、これはSubjectname__と呼ばれる異なるタイプです。

読み取り/書き込みの概念になじみがない場合は、Futurename __/Promisename__との素敵な類推ができます。 Futurename__は、Signalname __/SignalProducername__やObservablename__などの読み取り専用のプレースホルダーです。一方、pipe()Promisename__のように、Subjectname__は手動で実行できます。

スケジューラー

このエンティティは、両方の世界で同じ概念ですが、RACはシリアルのみであり、代わりにRxSwift機能は同時スケジューラも備えています。

組成

構成は、リアクティブプログラミングの重要な機能です。ストリームの構成は、両方のフレームワークの本質です。RxSwiftでは、ストリームはsequencesとも呼ばれます。

RxSwiftのすべてのオブザーバブルエンティティはObservableTypename__型であるため、Subjectname__およびObservablename__のインスタンスを、同じ演算子で追加の心配なしに構成します。

RAC空間では、Signalname__とSignalProducername__は2つの異なるエンティティであり、liftname__のインスタンスで生成されるものを作成できるようにするには、SignalProducername__のSignalname__を使用する必要があります。 2つのエンティティには独自の演算子があるため、物事を混合する必要がある場合は、特定の演算子が利用可能であることを確認する必要があります。反対側では、ホット/コールドオブザーバブルを忘れます。

この部分について、 Colin Eberhardt はうまくまとめています:

現在のAPIを見ると、シグナル操作は主に「次の」イベントに焦点を当てており、異なるスレッドで値の変換、スキップ、遅延、結合、観察を行うことができます。一方、シグナルプロデューサーAPIは、then、flatMap、takeUntil、catchなどの操作に関連するシグナルライフサイクルイベント(完了、エラー)に主に関係しています。

追加

RACにはActionname__およびPropertyname__の概念もあります。前者は主にユーザーの相互作用に関連する副作用を計算するタイプです。後者は、値が変化したときにタスクを実行するために値を観察する場合に興味深いです。 RxSwiftでは、Actionname__は再びObservablename__に変換されます。これは、iOSとMacの両方のRxプリミティブの統合であるRxCocoaname__にうまく示されています。 RACのPropertyname__は、RxSwiftでVariablename__(またはBehaviourSubjectname__)に変換できます。

Propertyname __/Variablename__は、命令型の世界をリアクティブプログラミングの宣言的な性質に橋渡しするための方法であるため、サードパーティのライブラリやiOS/Macスペースのコア機能を扱う際の基本的なコンポーネントである場合があることを理解することが重要です。

結論

RACとRxSwiftは2つの完全に異なる獣であり、前者はCocoaスペースで長い歴史を持ち、多くの貢献者がいます。後者はかなり若いですが、Java、JSまたは他の言語で効果的であることが証明された概念に依存しています。ネット。どちらの方が良いかは、好みによります。 RACは、観測可能なホット/コールドの分離が必要であり、それがフレームワークのコア機能であると述べています。RxSwiftは、それらの統合は分離よりも優れていると言います。これも副作用の管理/実行方法に関するものです。

RAC 3.0は、割り込みの概念、2つのエンティティ間の演算子の分割、信号の生成を開始するstartname__などの命令型動作の導入など、ホット/コールドオブザーバブルを分離するという主要な目標に加えて、予期しない複雑さを導入したようです。一部の人々にとっては、これらのことはナイスなものであり、キラー機能でさえあります。もう1つ覚えておくべきことは、RACはCocoaの慣習に可能な限り対応しようとしていることです。したがって、経験豊富なCocoa Devであれば、should RxSwiftよりも快適に作業できます。

一方、RxSwiftは、Reactive Extensionsのホット/コールドオブザーバブルなどのすべての欠点だけでなく、良い面も備えています。 RxJS、RxJava、またはRx.NetからRxSwiftへの移行は単純なことです。すべての概念は同じであるため、資料を見つけることは非常に興味深いものになります。プラットフォームを考慮して再適用できます。

どちらを選ぶかは間違いなく好みの問題であり、客観的な観点からどちらが優れているかを判断することは不可能です。唯一の方法は、Xcodeを起動し、両方を試して、より快適に作業できるものを選択することです。それらは、ソフトウェア開発の簡素化という同じ目標を達成しようとする、同様の概念の2つの実装です。

406
bontoJR