gpt4 book ai didi

android - 为什么 mutableSharedFlow subscriptionCount 在使用 ShareIn 时会发生变化

转载 作者:行者123 更新时间:2023-12-04 23:56:54 28 4
gpt4 key购买 nike

为什么使用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 的工作方式非常简单,就是启动一个无限期运行的协程,并收集源流以重新发出这些值。因此,与 mapmerge 运算符创建仅在收集时订阅源的冷流不同,shareIn 创建的流立即开始从源流收集,因此它立即被计为源流的订阅者。

下游 toNext() 包装第二个 SharedFlow,而不是第一个。第一个不知道下游订阅者。它仅从 shareIn 调用发送到单个 SharedFlow,因此它只有一个订阅者。

当您删除 shareIn 时,您的顶级 SharedFlow 将发送给在您的 toNext()merge() 中创建的两个订阅者 调用,所以它看到两个订阅者。请注意,在调用 collect 之前,它不会看到任何订阅者,因为它们是冷包装。

关于android - 为什么 mutableSharedFlow subscriptionCount 在使用 ShareIn 时会发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70958709/

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