gpt4 book ai didi

java - 订阅一个 Observable 而不触发它然后传递它

转载 作者:行者123 更新时间:2023-11-30 08:40:43 25 4
gpt4 key购买 nike

这可能会有点复杂,而且我对 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 兼容解决方案是什么?上面伪代码中概述的肯定不是出于各种原因,其中之一是在 Consumer 订阅 Observable 之前过早触发网络请求。在 DataProvider 中调用 subscribe() 之前,我已经尝试过 publish().autoComplete(2),但这似乎并没有是做这种事情的规范方式。感觉很老套。

编辑:通过 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com