我对rxjava2比较陌生,并且正在撼动摇滚乐。 我的问题是能够根据条件将一个流分成两个流然后连接它们。
实施例: 我有一个网络请求(Retrofit)返回 Single 。 此对象MyResponse包含由
获取/执行的过程列表.map(MyResponse::getProcedures)
.flatmap(Observable::fromIterable)
.flatmap(Procedure::execute)
这一部分正在运行从JSON创建的每个过程都被正确调用和执行,但是,其中一些过程具有依赖性,例如:1个过程在服务器上传文件,另一个禁用Wifi。 需要在其他程序之后发生Wifi禁用,否则会阻止上传执行。
我一直在玩RxJS Marbles找到合适的操作符,但它们都适用于1或2流到1。 在我的情况下,它应该是1到2。
1 - 解决方案是在集合上调用排序方法以对它们进行正确排序,然后通常执行它们。
2 - 有没有办法将特定条件的流分成2个不同的流(网络操作/硬件操作无论如何)?实现这样的目标:
.split(Procedure::hasPriority) // return true/false
.concat(splitTrue, splitFalse)
then execute them
由于
@Lukasz 谢谢,我用简化的案例测试了你的命题:
Observable.just(1, 2, 3, 4, 5, 6)
.publish(f ->
Observable.concat(
f.filter(this::isEven).map(this::printEven),
f.filter(this::isOdd).map(this::printOdd)
)
).subscribe();
它打印: 2是偶数,4是偶数,6是偶数,1是奇数,3是奇数,5是奇数,这是预期的行为。
在我的情况下,基于简单标志的顺序排序将是基本的,导致每个过程将独立于另一个进行评估。 我将对整个列表进行重新排序,并在考虑到程序之间的依赖性的情况下实施一些内容。
与此同时,回到书本,rx对新手来说不是那么友好。再次感谢
答案 0 :(得分:0)
我认为这可以使用带有函数的发布运算符的版本来完成。它的作用是,它允许您根据需要多次订阅上游可观察对象,并对其执行不同的操作,只要您最终从该函数返回单个observable。
所以我认为在你的情况下你会做类似
的事情.map(MyResponse::getProcedures)
.flatmap(Observable::fromIterable)
.publish(shared -> {
Observable.concat(
shared.filter(Prodedure::hasPriority).flatMap(Procedure::execute),
shared.filter(!Procedrue::hasPriority).flatMap(Procedure::execute)
)
})
希望这有帮助