【问题标题】:what is the alternative in coroutines for `share()` of `RxJava`?`RxJava`的`share()`的协程中的替代方案是什么?
【发布时间】:2019-02-27 10:01:51
【问题描述】:
我有一个配置文件,我正在获取它,结果获取标题和查询列表:字符串
并根据查询我应该实现不同的请求
我的意思是我有配置的 request1
并根据request1的结果,我应该将它与request2、request3……结合起来。
这些组合我想要平行
我知道我可以通过 RxJava 使用 share() 来实现这一点,但是我如何使用 Coroutines 来做到这一点?
【问题讨论】:
标签:
android
rx-java2
kotlinx.coroutines
【解决方案1】:
以非协程的方式考虑它,如果函数不是挂起而只是常规函数,你会怎么做?
您可以将发出的值存储在变量中并检查是否已缓存它,如果已缓存,则可以返回值,否则,计算这些值。
如果你有一些高级逻辑需要倾听(比如 RxJava 的 Subjects),你可以使用 Kotlin Coroutines Channels。
要创建频道,您可以使用Channel() 或ConflatedBroadCastChannel() 或其他变体。如果您希望您的频道与 RxJava 的 PublishSubject 完全一样,您可以使用 ConflatedBroadCastChannel:
val broadCastChannel = ConflatedBroadcastChannel<Int>()
您可以使用broadCastChannel.offer(value) 向频道发送值。
要从通道接收值,您可以使用简单的 for-each 循环:
for (i in broadCastChannel.openSubscription()) {
//your values
}