我想构建一个Repository
类,它返回一个Single<Something>
。
该类应该首先查找返回Maybe<Something>
的Cache
,如果Maybe
完成,则转到返回Single<Something>
的Service
interface Cache {
fun getSomething(): Maybe<Something>
}
interface Service {
fun getSomething(): Single<Something>
}
class Repository (
private val cache: Cache,
private val service: Service
) {
fun getSomething(): Single<Something> {
return cache.getSomething()
.????(feed.getSomething()) //onCompleteTransformToSingle() or similar
}
}
我已经搜索了JavaDoc,但似乎不存在用于此场景的转换器。
有什么好的处理方法吗?
4条答案
按热度按时间ufj5ltwl1#
这里有两个相当简单的选项可以使用。第一个我觉得更明确。第二个有一个好处,你会调用网络上的任何错误该高速缓存。
这些假设从该高速缓存返回一个Maybe。例如,如果在缓存中没有找到值,则返回Maya.empty()
1)如果流中有一个空的,switchIfEmpty()将使用调用网络的可观察变量,如果流中没有空的,网络将永远不会被调用。
2)空的maybe将在强制转换为Single()时返回错误,从而触发网络调用。
up9lanfz2#
当您需要使用元数据执行RxJava操作(缺少缓存结果)时,您可能必须使用
materialize()
将观察器链转换为元数据流。(抱歉我的Kotlin语不流利)
materialize()
操作符将观察者流转换为Notification
流。然后,您可以检查第一个通知,如果它有值,则使用该值。否则,进行网络调用。5f0d552i3#
使用以下flatMap调用,其中3个参数表示Maybe
示例
或者
cnh2zyt34#
defaultIfEmpty可用于在转换为Single时处理空的Maybe结果。
下面是一个如何实现的示例: