这有可能会有点复杂,我与观测量和RX模式经历没有那么多包涵:订阅可观察到的,而不会触发它,然后将它传递出去
假设你已经有了一些任意返回一个Observable的SDK方法。你从一个类中消费方法 - 除其他外 - 负责检索数据,并在这样做的时候执行一些缓存,所以我们称之为DataProvider
。然后你有另一个班想要访问由DataProvider
提供的数据。现在我们将其称为Consumer
。所以我们有我们的设置。
所有模式朋友的注意事项:我知道这不是MVP,它仅仅是一个类似的例子,但是我在我的应用程序中遇到了更复杂的问题。
话虽这么说,在科特林般的伪代码所描述的情况是这样的:
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()
}
}
的问题是,在调用sdk.subscribe()
在DataProvider
我已经触发了可观测的subscribe()
方法我不想要。我想让DataProvider
静静地听 - 在这个例子中,触发应该由Consumer
完成。
那么这个问题最好的RX兼容解决方案是什么?上述伪代码中概述的明确不是由于各种原因,其中之一是在Consumer
已订阅Observable之前过早触发网络请求。在拨打DataProvider
中的subscribe()
之前,我已尝试使用publish().autoComplete(2)
,但这似乎不是执行此类事情的标准方法。它只是觉得哈克。通过SO卓越的“相关”功能,我刚刚偶然发现了另一个指向不同方向的问题,但有一个解决方案,也可以在这里适用,即flatMap()
。我之前就知道这一点,但从来没有真正使用它。对我来说似乎是一种可行的方式 - 您对此有何看法?
必须有办法脱身,而无需调用'订阅()'内'的DataProvider# getData()',而是根据你需要使用其他操作符:'doOnNext()'如果你需要在链中修改事件而不修改事件,'map'或'flatMap'他们的方式等 – AndroidEx
我不知道'doOnNext()' - 现在会试用它。 – ubuntudroid
@AndroidEx'doOnNext()'成功了!请将您的评论转换为答案,我很乐意将其标记为已接受的答案。 – ubuntudroid