作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为什么使用ShareIn函数会改变
val sharedf = MutableSharedFlow<Int>()
fun Flow<Int>.print() : Flow<Int> {
return map {
println("in print : $it")
it
}
}
fun Flow<String>.printS() : Flow<Int> {
return map {
println("in print : $it")
it.toInt()
}
}
fun Flow<Int>.toNext() : Flow<Int> {
return merge(
filterIsInstance<Int>().print(),
filterIsInstance<String>().printS(),
)
}
当我这样使用主函数时
fun main() = runBlocking<Unit> {
launch {
sharedf.onSubscription{
println("subsCount : ${sharedf.subscriptionCount.value}")
}
.shareIn(GlobalScope, SharingStarted.Lazily)
.toNext()
.collect()
}
launch {
for (i in 0..3){
delay(500)
sharedf.emit(i)
}
}
}
订阅人数:1
但如果我删除 ShareIn
订阅人数:2
为什么我必须使用 ShareIn 即使 sharedf 已经是 MutableSharedFlow
最佳答案
shareIn
的工作方式非常简单,就是启动一个无限期运行的协程,并收集源流以重新发出这些值。因此,与 map
和 merge
运算符创建仅在收集时订阅源的冷流不同,shareIn
创建的流立即开始从源流收集,因此它立即被计为源流的订阅者。
下游 toNext()
包装第二个 SharedFlow,而不是第一个。第一个不知道下游订阅者。它仅从 shareIn
调用发送到单个 SharedFlow,因此它只有一个订阅者。
当您删除 shareIn
时,您的顶级 SharedFlow 将发送给在您的 toNext()
的 merge() 中创建的两个订阅者
调用,所以它看到两个订阅者。请注意,在调用 collect
之前,它不会看到任何订阅者,因为它们是冷包装。
关于android - 为什么 mutableSharedFlow subscriptionCount 在使用 ShareIn 时会发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70958709/
为什么使用ShareIn函数会改变 val sharedf = MutableSharedFlow() fun Flow.print() : Flow { return map {
我是一名优秀的程序员,十分优秀!