【发布时间】:2017-07-26 15:39:56
【问题描述】:
我对新的 RxJava Sources 感到非常兴奋,例如:Single、Maybe、Completable,它使您的接口类更清晰,并防止在创建“源”(例如忘记打电话onComplete())
但是它需要大量的样板来将它们组合成一个复杂的流。
例如我们有常见的 Android 加载和缓存数据的情况。假设我们有 2 个来源 api 和 cache,我们想将它们合并:
public interface Api {
Single<Integer> loadFromNetwork();
}
public interface Cache {
Maybe<Integer> loadFromCache(); //maybe because cache might not have item.
}
让我们试着把它结合起来:
final Single<Integer> result = cache.loadFromCache()
.switchIfEmpty(api.loadFromNetwork());
它不会编译,因为Maybe 没有重载Maybe.switchIfEmpty(Single):Single
所以我们必须转换所有内容:
final Single<Integer> result = cache.loadFromCache()
.switchIfEmpty(api.loadFromNetwork().toMaybe())
.toSingle();
另一种可能的组合方式也需要сonversion:
final Single<Integer> result = Observable.concat(
cache.loadFromCache().toObservable(),
api.loadFromNetwork().toObservable()
).firstOrError();
因此,如果不进行许多增加代码噪音并创建大量额外对象的转换,我看不到任何使用新源的方法。
由于这些问题,我无法使用Single、Maybe、Completable,并继续在任何地方使用Observable。
所以我的问题是:
结合
Single、Maybe、Completable。为什么这些来源没有重载以使梳理更容易。
为什么这些来源没有共同祖先并将其用作
switchIfEmpty等方法的参数?
P.S.有人知道为什么这些类没有任何共同的层次结构吗?
从我的角度来看,如果某些代码可以与 Completable 一起工作,那么它也可以与 Single 和 Maybe 一起工作吗?
【问题讨论】:
-
我认为this 涵盖了除最佳实践之外的所有内容。如果您需要
switchIfEmptySingle之类的方法,也许您可以要求它。 -
当一个项目在缓存中不可用并且您从网络加载它时,您是否希望网络调用也更新缓存数据?我的意思是,你为什么要将两者结合起来?假设您有一个缓存存储,例如一个房间数据库,并且您观察到一个带有
Flowable的表,如果没有任何特定于您的查询的内容,则不会发出此流。同时你发送一个请求,如果有数据返回,当你把它放到你的表中时,Flowable会发出不同的结果。
标签: java android rx-java rx-java2