如何在流中使用来自另一个流数据的数据? (科特林流程)

Posted

技术标签:

【中文标题】如何在流中使用来自另一个流数据的数据? (科特林流程)【英文标题】:How can I use data from another flow data in flow? (Kotlin Flow) 【发布时间】:2021-12-28 05:24:39 【问题描述】:

我写的代码如下。

suspend fun getDataByRegion(): Flow<Result?> 
    // getRegion() return Flow<Region>
    return getRegion().map  region: Region ->
        repository.requestDataFromServer(region)
    

问题是 repository.requestDataFromServer(region) 调用了两次。

所以我认为我应该使用zipcombine 之类的运算符。

在使用这些运算符时,第二个流如何使用第一个流的数据?

【问题讨论】:

你怎么知道数据被发射了两次?您是否添加了日志语句?将它们包括在问题中。 在现有代码中,我找不到任何问题。你能发布更多代码吗? 为什么这个函数标记为suspend?好像getRegion() 只是返回一个Flow,所以它也不应该是一个挂起函数。 【参考方案1】:

使用combinezip 运算符,您不能依赖对方的结果。所以一般来说,你使用map 的链接方法是可以的。

您有多种选择:

假设您的存储库方法没有从其他任何地方调用,它被调用两次的原因是区域Flow 发出了两次。所以试着找出为什么会这样。

无论如何,如果您的区域 Flow 方法两次返回相同的区域,您可以通过简单地添加来修复它 .distinctUntilChanged()getRegion() 之后点赞:

getRegion().distinctUntilChanged().map  region: Region ->
   repository.requestDataFromServer(region)

这将确保您的区域Flow 不会以相同的数据重复发射。或者,如果这始终是预期行为,则直接将 distinctUntilChanged() 添加到存储库方法中。

问问自己这个方法是否真的需要返回一个流 (Flow)。我想您需要一个流,因为该区域可以在运行时更改,并且您希望应用程序中的某些内容自动更新?但如果不是,您可以简单地将流转换为单个结果:

val region = getRegion().first()
repository.requestDataFromServer(region)

【讨论】:

以上是关于如何在流中使用来自另一个流数据的数据? (科特林流程)的主要内容,如果未能解决你的问题,请参考以下文章

根据流中的数据导航

Java 8:如何在流中使用异常抛出方法?

在流中组合音频和图像

java的io流中,啥时候应该在流关闭之前加flush,啥时候不用

DataContractSerializer:在流中找不到引用 id 'xyz' 的反序列化对象。如何恢复数据?

音频流中的歌曲标题编码