LR8*_*R89 5 java android rx-java rx-android rx-java2
我正在使用RxAndroid 2.0.1和RxJava 2.0.6。
我有两个观察值:一个Maybe<MyObject>基于某些字符串(ID)的返回。当返回可选对象时,我必须调用第二个对象,该对象采用MyObject实例,并Single<Boolean>在对象满足某些条件时返回。然后,我可以对对象实例进行进一步的操作。
我当前的实现如下:
objectDAO.getById(objectId)
.subscribe(
myObject -> checkCondition(myObject),
throwable -> /* Fallback */,
() -> /* Fallback */
);
private void checkCondition(final MyObject myObject) {
otherDAO.checkCondition(myObject)
.subscribe(
isTrue -> {
if (isTrue) {
// yay! now I can do what I need with myObject instance
} else {
/* Fallback */
}
},
throwable -> /* Fallback */
);
}
Run Code Online (Sandbox Code Playgroud)
现在我想知道如何简化我的代码。我的想法:
尝试使用zip-我不能这样做,因为直到第一个Observable返回MyObject之前,第二个Observable才能被订阅
尝试使用filter-现在的问题是,我需要使用阻塞获取来调用第二个可观察的对象。它可以正常工作,但看起来像代码气味:
objectDAO.getById(objectId)
.filter(myObject ->
otherDAO.checkCondition(myObject).blockingGet()
)
.subscribe(
myObject -> checkCondition(myObject),
throwable -> /* Fallback */,
() -> /* Fallback */
);
Run Code Online (Sandbox Code Playgroud)尝试使用flatMap-当我需要返回原始对象时,第二个observable返回Boolean。因此,我需要映射一个代码段blockingGet并返回原始对象或Maybe.empty()
有任何建议如何以使代码“干净”(更小并且仍然清楚内部正在发生什么)的方式进行处理?
您可以做的一件事:
objectDAO.getById(objectId)
.flatMapSingle(myObject -> otherDAO
.checkCondition(myObject)
.map(isTrue -> Pair.create(myObject, isTrue))
)
Run Code Online (Sandbox Code Playgroud)
然后,您可以按Observable<Pair<MyObject, Boolean>>自己的意愿进行操作,然后进行:subscribe直接检查Boolean并filter通过布尔值等检查该位置。
| 归档时间: |
|
| 查看次数: |
970 次 |
| 最近记录: |