这可能会变得有点复杂,而且我对 Observables 和 RX 模式没有那么丰富的经验,所以请耐心等待:
假设您有一些返回 Observable 的任意 SDK 方法。您使用一个类中的方法,该类除其他外还负责检索数据,并在执行此操作时进行一些缓存,因此我们将其称为 DataProvider
。然后你有另一个类想要访问DataProvider
提供的数据。现在我们将其称为Consumer
。这样我们的设置就完成了。
给所有模式 friend 的旁注:我知道这不是 MVP,它只是我在应用程序中面临的类似但更复杂的问题的示例。
话虽这么说,在类似 Kotlin 的伪代码中,所描述的情况将如下所示:
class Consumer(val provider: DataProvider) {
fun logic() {
provider.getData().subscribe(...)
}
}
class DataProvider(val sdk: SDK) {
fun getData(): Consumer {
val observable = sdk.getData()
observable.subscribe(/*cache data as it passes through*/)
return observable
}
}
class SDK {
fun getData(): Observable {
return fetchDataFromNetwork()
}
}
问题是,在 DataProvider
中调用 sdk.subscribe()
时,我已经触发了 Observable 的 subscribe()
方法这是我不想要的。我希望 DataProvider
只是默默地监听 - 在此示例中,触发应该由 Consumer
完成。
那么解决这个问题的最佳 RX 兼容解决方案是什么?上面伪代码中概述的肯定不是出于各种原因,其中之一是在消费者订阅 Observable 之前过早触发网络请求。在 DataProvider
中调用 subscribe()
之前,我已经尝试过 publish().autoComplete(2)
,但这似乎并不适用成为做这类事情的规范方式。只是感觉很hacky。
编辑:通过SO出色的“相关”功能,我刚刚偶然发现了另一个指向不同方向的问题,但有一个也适用于此处的解决方案,即 flatMap()
。我以前就知道这个,但从未真正使用过它。对我来说这似乎是一种可行的方法 - 您对此有何看法?
最佳答案
如果缓存步骤不应该修改链中的事件,则可以使用 doOnNext()
运算符:
class DataProvider(val sdk: SDK) {
fun getData(): Observable<*> = sdk.getData().doOnNext(/*cache data as it passes through*/)
}
关于java - 订阅 Observable 而不触发它然后传递它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35517306/