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