0

我在android中使用firebase和一些複雜的數據。我需要保存引用,並且遇到了zip操作的問題,或者我處理RX的方式。當stream2基於stream1時,如何避免.zip(stream1,stream2,BiFun)兩次訂閱stream1?

我想創建一個新的A object關於某種B信息,並更新我的B object有信息關於創建A。當火力業務均出現了成功,我將返回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 }) 

當通過logcat的打算,我可以看到SingleA獲得認購到兩次,兩次推到火力點。我想避免這個!

那麼,當B依賴於A時,如何在A和B上使用zip函數;沒有A被執行兩次?

+0

爲什麼你需要壓縮它們?從A發出的任何輻射都是平面圖,你可以訂閱B – elmorabea

+0

方法簽名應該返回'Single ',這就是爲什麼 – Yokich

+0

你會得到雙重訂閱,因爲你在兩種情況下的排放源是相同的,這就是firebaseCall(A 「ABC」,bKey)),然後你用自己壓縮它,但是如果你想只映射返回類型,那麼只需使用map operator – elmorabea

回答

1

你並不真的需要zip爲此,你可以簡單的地圖a回:

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

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

真的,這是一個很好的解決方案。我做了類似的東西,現在我正在使用,但爲了教育目的。爲什麼zip使'singleA'訂閱兩次,我怎麼能避免它? – Yokich

+0

我做了一些研究,簡單的情況是'zip'訂閱了這兩個源,然後做了它的魔術,所以很容易解釋爲什麼第一個流預訂了兩次。 我會將此標記爲答案;做一個乾淨的解決方案 – Yokich