如果可能完成,则将Maybe从另一个源转换为单个
我想建立一个Repository
类,返回一个Single
。
该类首先应该查找返回Maybe
的Cache
,如果Maybe
完成了我的Service
,返回Single
interface Cache { fun getSomething(): Maybe } interface Service { fun getSomething(): Single } class Repository ( private val cache: Cache, private val service: Service ) { fun getSomething(): Single { return cache.getSomething() .????(feed.getSomething()) //onCompleteTransformToSingle() or similar } }
我已经通过JavaDoc进行了搜索,但是似乎并不存在这种情况下的变换器。
有处理这个好方法吗?
这里有两个相当简单的选项,你可以使用。 首先我发现更明确。 第二个好处是您将在缓存中的任何错误时调用网络。
这些假设从缓存中返回一个Maybe。 例如,如果在缓存中找不到任何值,则返回Maybe.empty()
1)如果流中有空,switchIfEmpty()将使用调用网络的备用observable。 如果流中没有空的话,网络永远不会被调用。
override fun getSomething(): Single { return cache.getSomething() .switchIfEmpty( Maybe.defer { feed.getSomething().toMaybe() } ) .toSingle() }
2)一个空的可能会返回一个错误,当投掷toSingle(),触发网络调用。
override fun getSomething(): Single { return cache.getSomething() .toSingle() .onErrorResumeNext { feed.getSomething() } }
当需要使用元数据执行RxJava操作(不存在缓存结果)时,可能必须使用materialize()
将观察链变换为元数据流。
(对于我在Kotlin中缺乏流畅性的道歉)
fun getSomething(): Single { return cache.getSomething() .toObservable() .materialize() .take(1) .flatMap( it.hasValue() ? Single.just( it.getValue() ) : Single.fromCallable( apiCall() ) ); }
materialize()
运算符将观察者流转换为Notification
流。 然后你可以检查第一个通知,如果它有一个值,就使用它。 否则,请拨打您的网络电话。