0

私はいくつかの複雑なデータでアンドロイドのfirebaseを使用しています。私は参照を保存する必要があり、私は私のzip操作、または私はRX全体を処理している方法で問題を取得しています。stream1を2回購読する.zip(stream1、stream2、BiFun)を避けるにはどうすればよいですか?

Bについての情報を含む新しいA objectを作成し、についての情報を持つようにB objectを更新したいとします。 firebase操作が両方成功しているとき、私はlogcatを経由する場合はSingle<A>

val singleA = firebaseCall(A("ABC", bKey)) 

val singleB = singleA.flatMap{ a -> firebaseCall(B(aKey)) } 

return Single.zip(singleA, singleB, BiFunction { a, b -> a }) 

私はSingleAが二倍に加入してもらうことを見ることができ戻り、firebase 2回プッシュします。私はこれを避けたい!

したがって、BがAに依存している場合は、AとBでどのようにジップ関数を使用できますか。 Aは2回実行されていませんか?

+0

なぜあなたはそれらを圧縮する必要がありますか? Aからの放出はフラットになり、B – elmorabea

+0

に登録することができます。メソッドシグネチャは 'Single 'を返す必要があります。そのため、 – Yokich

+0

二重サブスクリプションを得る理由は、どちらの場合も同じです.firebaseCall(A "ABC"、bKey))、それからあなた自身でzipしますがflatMappedです。戻り値の型だけをマップする場合は、マップ演算子 – elmorabea

答えて

1

あなたは本当に、このためzipは必要ありませんすることができます簡単なマップaバック:

val singleA = firebaseCall(A("ABC", bKey)) 

return singleA.flatMap{ a -> firebaseCall(B(aKey)).map { a } } 
+0

を使用してください。私は今使っているものと似たようなことをしましたが、教育目的のために。なぜzipは 'singleA'を2回購読するのですか?どうすればそれを避けることができますか? – Yokich

+0

私はいくつかの調査を行いました。単にzipが両方のソースに購読してからその魔法を実行するという単純なケースなので、最初のストリームが2回購読する理由を簡単に説明します。 これを答えとしてマークします。きれいな解決策 – Yokich

関連する問題