2017-08-30 13 views
1

観測可能なソースの1つがデータを放出するとき、他の観測可能なデータがそこに放出されるのを待つのではなく、最新の放出データがあればそれを得ることを望むzipを達成したい。最新の他の観測データを取得するRxJavaジップ

obs1 --true-|-> 
obs2 --true-|-> 
obs3 --1-2-3-4-> 

ジッパーは、私は私の質問は理にかなって願っていますパラメータ

true, true, 1 
true, true, 2 
true, true, 3 
true, true, 4 

TriFunctionを実行する必要があります。

拡張質問

私はすでに問題の一部を解決するため、私はあなたたちのために別の問題を得ました。 obs1およびobs2は、trueまたはfalseのいずれかを発行する高価な操作です。私が必要としていたのは、すべての排出量がobs3であることです。いずれかが以前の排出量でfalseを放出する場合、obs1またはobs2を再実行する必要があります。私が上に書いたのは、obs1obs2の両方が、obs3の最初の放射でtrueを放射する最良の場合です。

-------1------------2-----------------3-------------> 
---true/false---true/re-execute---true/re-execute---> 
---true/false---true/re-execute---true/re-execute---> 

編集"どちらか"は、拡張された問題で誤解を招く恐れがあります。

私がそれが意味するのは、前回の放出時にobs1がfalseである場合、obs1を再実行することです。前回の放射でobs2が偽の場合は、obs2を再実行してください。それらのいずれかがfalseである場合、両方を再実行しないでください。

+1

だから、あなたは、各ソースの_latest_値を_combine_したいと言っていますか?その場合、 'combineLatest'を探しています - はい、時にはRxJavaが本当に明らかです。 :-) –

+0

ここに事がありますが、私は1つの観察可能なデータを必要とするので、2つの観測値からのデータが必要です。その要件は高価なので、一度だけ実行するのが理想です。 @ david.mihola – Hohenhiem

+0

ああyeah combineLatestが最適です。おかげで@ david.mihola – Hohenhiem

答えて

1

編集:拡張質問は、例えば、異なるオペレータを必要と全く別の問題である:

Observable<Boolean> obs1 = ... 
Observable<Boolean> obs2 = ... 

Observable<Integer> obs3 = ... 

Function3<Integer, Boolean, Boolean> func = ... 

// store last result of obs1 and obs2 
boolean[] lastResults = { false, false }; 

// for each main value 
obs3.concatMap(v -> { 
    // if any of the previous results were false 
    if (!lastResults[0] || !lastResults[1]) { 
     // run both obs1 and obs2 again 
     return Observable.zip(obs1, obs2, (a, b) -> { 
      // save their latest results 
      lastResult[0] = a; 
      lastResult[1] = b; 
      // apply the function to get the output 
      return func(v, a, b); 
     }); 
    } 
    // otherwise call the function with true 
    return Observable.just(func.apply(v, true, true)); 
}) 
.subscribe(...); 
+0

こんにちは@akarnokd、私のすべての問題を表示するために私の質問を更新しました。 – Hohenhiem

+0

私が心に留めていることは、あなたが言ったように 'withLatestFrom'を使い、' obs1'と 'obs2'で' scan() 'を使うことです。しかし、私は累積値にアクセスし、BiFunction'の中で自分のロジックを処理する前に、まずscanの中に入る必要があるので 'scan()'は大した助けになりません。しかし、私のロジックはrxで書かれています。 BiFunction'と呼ばれる。 – Hohenhiem

+0

ああ、サーカル@akarnokd、あなたはそこにその変数を置くので、rxについての私の考え方は壊れています。それは本当に大丈夫ですか?ストリーム外のデータにアクセスしますか? – Hohenhiem

関連する問題