我最近才开始使用Rx,因此,如果这不是执行我要执行的操作的最佳方法,请更正它。
目标:拥有一个可观察到的命中API(具有Retrofit),并且每次执行都会将响应保存到本地存储中,但是不必每次订阅时都这样做,因为我会在多个地方做到这一点。
具有这样的内容:
myRetrofit.create(MyInterface::class.java).hitEndpoint()
我想做这样的事情:
myRetrofit.create(MyInterface::class.java).hitEndpoint()
.intercept { storageUtils.saveItem("key", it) }
问题:如何在观察对象订阅之前运行函数?
答案 0 :(得分:0)
要考虑的一个选项是使用ObservableTransformer<T>
。
解决方案的草图如下所示:
class LocalStorageComposer<T>: ObservableTransformer<T,T>(private val localStorage : LocalStorage) {
override fun apply(upstream: Observable<T>) {
return upstream.map {
localStorage.store(it)
it
}
}
}
然后您像这样消耗它:
someApi.getAllData()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.compose(LocalStorageComposer(localStorage))
.subscribe //etc
如果LocalStorageComposer
是可以使用Dagger 2之类的DI框架注入的,它将更好地工作。有效地,它允许您在API调用中作为附加步骤将映射到本地存储,而无需明确引用它。
要看的另一件事是对OkHttp(链接here)的缓存,它可能更适合您的用例。
答案 1 :(得分:0)
如果我对问题的理解正确,那么您想在订阅活动之前先做点事。在这种情况下,只需使用map
运算符即可完成工作。
看起来像这样:
myRetrofit.create(MyInterface::class.java)
.map{
//operation, you can access the response as "it"
it
}.hitEndpoint()
答案 2 :(得分:0)
根据@akarnokd的评论,我只使用了.doOnNext { }
。
其他解决方案也可以使用,但这是最简单的。