【问题标题】:How do I avoid .zip(stream1, stream2, BiFun) subscribing to stream1 twice, when stream2 is based on stream1?当stream2基于stream1时,如何避免.zip(stream1,stream2,BiFun)订阅stream1两次?
【发布时间】:2017-12-27 13:33:13
【问题描述】:

我在 android 中使用带有一些复杂数据的 firebase。我需要保存参考资料,但我的 zip 操作或我处理 RX 的整体方式出现问题。

我想创建一个新的A object,其中包含有关某个B 的信息,并更新我的B object 以获取有关创建的A 的信息。当firebase操作都成功后,我将返回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 被订阅了两次,并将两次推送到 firebase。我想避免这种情况!

那么,当 B 依赖于 A 时,如何在 A 和 B 上使用 zip 函数;并且没有执行两次 A?

【问题讨论】:

  • 为什么需要压缩它们?来自 A 的任何发射都将是 flatMapped,您只需订阅 B
  • 方法签名应该返回Single<A>,这就是为什么
  • 您获得双重订阅,因为您在两种情况下的排放源是相同的,即 firebaseCall(A("ABC", bKey)),然后您可以自行压缩它,但如果需要,您可以使用 flatMapped只“映射”返回类型,然后只使用映射运算符

标签: android firebase-realtime-database reactive-programming rx-java2 rx-kotlin


【解决方案1】:

您实际上并不需要 zip,因为您可以简单地将 a 映射回来:

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

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

【讨论】:

  • 没错,这是一个不错的解决方案。我做了类似的事情,我现在正在使用,但出于教育目的。为什么 zip 会导致 singleA 订阅两次,我该如何避免呢?
  • 我做了一些研究,只是zip 订阅了两个来源然后发挥了它的魔力,所以很容易解释为什么第一个流订阅两次。我会将此标记为答案;成为一个干净的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-08
  • 2020-02-17
  • 1970-01-01
  • 2019-09-07
相关资源
最近更新 更多