在我的 Android 应用程序中,我使用的是域级别的存储库接口,该接口由使用 SqlBrite 实现的本地数据库和带有 Retrofit 可观察对象的网络 api 支持。所以我getDomains(): Observable<List<Domain>>
在 Repository 中有方法,在我的 Retrofit 和 SqlBrite 中有两个相应的方法。我不想连接或合并,或将这两个 observables 放在一起。我希望我的存储库只从 SqlBrite 获取数据,并且由于 SqlBrite 返回 QueryObservable,它在onNext()
每次底层数据更改时触发,我可以独立运行我的网络请求并将结果存储到 SqlBrite 并使用从网络获取并存储到数据库数据来更新我的 Observable . 所以我尝试实现我的存储库的getDomains()
方法如下:
fun getDomains(): Observable<List<Domain>> {
return db.getDomains()
.doOnSubscribe {
networkClient.getDomains()
.doOnNext { db.putDomains(it) }
.onErrorReturn{ emptyList() }
.subscribe()
}
}
但是在这种情况下,每次客户端应该订阅,每次它都会发出网络请求,那就不太好了。我考虑过其他do...
操作员将请求移到那里,但是doOnCompleted()
如果 QueryObservable 永远不会被调用,直到我在toBlocking()
某个地方调用,我不会这样做,doOnEach()
也不好,因为它每次从数据库中提取项目时都会发出请求。我也尝试使用replay()
运算符,但尽管在这种情况下缓存了 Observable,但订阅会发生并导致网络请求。那么,如何以期望的方式组合这两个 Observable 呢?