12

Intro to RxScheduling and Threadingセクションでは、次のように述べています。

SubscribeOn と ObserveOn の使用は、最終的なサブスクライバーによってのみ呼び出される必要があります

また、UI アプリケーションでは、通常は最終サブスクライバーであるプレゼンテーション レイヤーが、これらのメソッドを呼び出す必要があるとも述べています。

これが不便な状況がいくつか見られるため、アドバイスがしっかりしているかどうか疑問に思っています。

  1. まず第一に、プレゼンテーション レイヤーが、データ レイヤーからの Observable をサブスクライブする場所を決定する必要があるとは思いません。私の意見では、データがデータベースから来ているのか、REST API から来ているのか、メモリから来ているのか、プレゼンテーション層は認識しないはずです。このため、subscribeOn()Observable を返す前にデータ層が呼び出し、IO スケジューラまたは直接のスケジューラを都合のよいように渡すと便利です。
  2. プレゼンテーション レイヤーが何らかのサービスまたはユース ケースから Observable を取得し (データ レイヤーから取得)、このサービスが何らかの計算スケジューラでストリームを処理する必要があると判断した場合、なぜプレゼンテーション レイヤーはこれを気にする必要があるのでしょうか?
  3. 元は UI からのストリームはどうでしょうか。そのため、UI スレッドでサブスクライブする必要があります。次に、何らかのサービスに送信されて何らかの作業が行われ、最終的にプレゼンテーション層に戻って UI スレッドで観察されます。これには、UI ストリームがsubscribeOn()UI スケジューラ、次にobserveOn()他のスケジューラ、最後observeOn()に UI スケジューラである必要があります。この場合、最後のサブスクライバーsubscribeOn()observeOn()のみ呼び出すことができるということは、ストリームを UI スレッドでのみ処理できることを意味します。

アプリケーションのアーキテクチャを犠牲にし、最終的なサブスクライバーのみがこれら 2 つのメソッドを呼び出すことでスレッドを簡単に切り替える Rx の機能を無視する正当な理由はありますか?

4

2 に答える 2

3

あなたが本を読み、そこにあるガイダンスのいくつかに挑戦するために時間を割いてくれたことを嬉しく思います.

私がこのガイダンスを提供する理由は、

  1. 同時実行は難しく、シンプルなルールを持つことでチームはより良いコードを作成できます
  2. 並行性は難しいものであり、並行性の問題を特定する場所を 1 か所にすると、スタック/階層化のより良いメンタル モデルが可能になり、テストが簡素化されます。アプリケーションに同時実行性を導入する層が増えるほど、事態は悪化します
  3. UI スレッドをブロックすることは良いニュースではありません。できるだけ早く UI スレッドを終了し、UI に戻るデータの処理をできるだけ遅らせることが望ましいです。このパターンは、その目標を達成することを目的としています。

これらは明らかに私の意見ですが、これらの単純なガイドラインが、多数のプロジェクトのコードをクリーンアップし、コード ベースを削減し、テスト能力を向上させ、予測可能性を向上させ、多くの場合、パフォーマンスを大幅に向上させるのに役立つのを見てきました。

残念ながら、これらのプロジェクトのほとんどは NDA によって保護されているため、これらのプロジェクトのケース スタディをまとめることは困難です。

それがあなたにとってどのように機能するか、または別のパターンをどのように適用するかを知りたいと思います.

于 2016-01-09T21:38:51.877 に答える
3
  1. プレゼンテーション レイヤーは、オブザーバブルがどこから来るかは気にしませんが、UI スレッドをロックする可能性があるかどうかは気にします。したがって、プレゼンテーション層は、それが起こらないように予防措置を講じる必要があります。これは、安全層を備えた至福の無知のケースです。

  2. プレゼンテーション層は気にしません。それ自体がブロックされていないことを確認したいだけです。

  3. ストリームが UI からのもので、処理に長い時間がかかる場合、ストリーム所有者はこれに注意し、非 UI スケジューラで処理されるようにする必要があります。次に、UI は、そこで消費する必要がある場合、UI スレッドに戻ることを確認する必要があります。処理が高速であれば問題ありません。

于 2016-01-09T08:53:39.650 に答える