【发布时间】:2021-11-27 14:49:16
【问题描述】:
我有一个用例,我需要触发从流中收集的特定事件并在它关闭时重新启动它。我还需要将所有事件发送到不同的流程。我当前的实现如下所示:
scope.launch {
val flowToReturn = MutableSharedFlow<Event>()
while (true) {
client
.connect() // returns Flow<Event>
.catch { ... } // ignore errors
.onEach { launch { flowToReturn.emit(it) } } // problem here
.filterIsInstance<Event.Some>()
.collect { someEvent ->
doStuff(someEvent)
}
}
}.start()
这个想法是在客户端断开连接时始终重新连接(collect 然后返回并开始新的迭代),同时将外部流生命周期与内部(连接)生命周期分开。与潜在的多个订阅者共享流是次要问题。
正如emit 文档所述,它不是线程安全的。那我应该从新的协程中调用它吗?我担心的是,如果外部流没有订阅者,emit 将暂停,无论如何我都需要运行下游管道。
【问题讨论】:
标签: kotlin kotlin-coroutines flow