这似乎是一件简单的事情,但我暂时找不到解决方案。所以我有几个返回不同对象的单一来源,我想获得具有分组结果的单一来源。
请参阅示例:
val singleA = Single.just(true)
val singleB = Single.just(20)
val singleC = Single.just("text")
val singleABC = Single.groupSingles(singleA,singleB,singleC)
singleABC.subscribe { resultA: Boolean, resultB:Int, resultC:String -> //do something }
实际上,所有单身人士(A,B和C(都执行长期操作,我不想一个接一个地称呼他们,而是更相似。
类似于Observable.combineLatest()
但结果单一
您要查找的是zip运算符。zip
可用于关联来自多个来源的排放,并且具有仅在其每个潜在源排放时才排放的区别。所以。。。
- 如果有两个源,则当两个源都发出时,
zip
将发出两个值。 - 如果有三个源,则当所有三个源都发出时,
zip
将发出三个值。
如果有四个源, - 当所有四个源都发出时,
zip
将发出四个值。 - 。等
- 如果任何源发出错误,将在下游触发
onError
有了这种理解,您可以像这样将zip
用于您的案例:
val singleA = Single.just(true)
val singleB = Single.just(20)
val singleC = Single.just("text")
val singleABC =
Single.zip(
singleA,
singleB,
singleC,
Function3 { resultA: Boolean, resultB: Int, resultC: String ->
// do something
}
)
(回想起来,你其实离得很近(
我发现 RxMarbles 页面是一个有用的资源,可以获取有关不同操作员如何工作的动手、视觉视角。 我鼓励你在那里玩一会儿,以培养对任何你不太理解的东西的感觉,并发现一些你不知道存在的东西。(它并不详尽地显示所有运算符,但它涵盖了许多常见的运算符(。
有Single.zip()
运算符 - 您可以将多个Single
源合并为一个。
如果该运算符不满足您的要求,您可以为每个Single
源调用Single.toObservable()
并使用Observable.combineLatest()