【发布时间】:2017-03-22 12:38:38
【问题描述】:
我正在使用 RxAndroid 2.0.1 和 RxJava 2.0.6。
我有两个 observable:一个基于某个字符串 (ID) 返回 Maybe<MyObject>。当返回可选对象时,如果对象满足某些条件,我必须调用第二个接受 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 */
);
}
现在我想知道如何简化我的代码。我的想法:
尝试使用
zip- 我不能,因为在第一个 Observable 返回 MyObject 之前无法订阅第二个 Observable-
尝试使用
filter- 现在的问题是我需要使用阻塞 get 来调用第二个 observable。它可以正常工作,但看起来像代码异味:objectDAO.getById(objectId) .filter(myObject -> otherDAO.checkCondition(myObject).blockingGet() ) .subscribe( myObject -> checkCondition(myObject), throwable -> /* Fallback */, () -> /* Fallback */ ); 尝试使用
flatMap- 第二个可观察对象返回布尔值,而我需要返回原始对象。因此,我需要使用blockingGet映射代码 sn-p 并返回原始对象或Maybe.empty()
有什么建议可以让代码“干净”(它更小,而且内部发生的事情仍然很清楚)吗?
【问题讨论】:
-
objectDAO.getById(objectId).flatMap(myObject -> otherDAO.checkCondition(myObject).map(isTrue -> Pair.create(myObject, isTrue))- 那么你有一个Observable<Pair<MyObject, Boolean>>,可以随心所欲地继续:直接订阅并检查Boolean那里,filterBoolean值等跨度> -
@david.mihola 它类似于我的第三种方法,只是现在我意识到我不需要使用阻塞获取。所以与其返回
Pair<Boolean, MyObject,我可以检查布尔值并返回Maybe.just(myObject)或Maybe.empty() / Maybe.error()仍然不确定这是否是一个好的解决方案。 -
另外,我好像不能使用
objectDAO.flatMap(otherDao.map())组合,当我把它改成objectDAO.map(otherDao.map())然后结果是Single<Maybe<Pair<Boolean, MyObject>>>这也不是很好 -
是的,对不起 - 它叫
flatMapSingle! -
是的,我也发现我可以用
flatMapSingle代替。现在我有其他问题,但与原始问题无关。请在下面粘贴您的完整答案,以便我接受:)
标签: java android rx-java rx-android rx-java2