Flow 性能:19. CollectLatest 处理最新值

本篇解析 example-flow-19.kt。学习一种处理消费慢的进阶手段。

1. 核心操作符:collectLatest

collectLatestconflate 类似,都关注“最新值”。但它们的处理逻辑不同:

  • conflate:如果收集器忙,就丢弃发射出的中间值。
  • collectLatest:当新值发射时,如果收集器正在处理旧值,它会立即取消旧值的处理代码块,并开始处理新值。

2. 代码解析

1
2
3
4
5
6
simple()
.collectLatest { value ->
println("Collecting $value")
delay(300) // 模拟 300ms 的处理逻辑
println("Done $value")
}
  • 100ms:发射 1,开始处理 1。
  • 200ms:发射 2。此时 1 仅处理了 100ms,立即被取消,开始处理 2。
  • 300ms:发射 3。此时 2 仅处理了 100ms,立即被取消,开始处理 3。
  • 600ms:3 终于处理完了(300ms),打印 “Done 3”。
  • 结果:只看到 1, 2, 3 的 “Collecting” 日志,但只有 3 打印了 “Done”。

3. 开发者感悟

collectLatest 非常适合处理诸如“搜索框自动补全”的场景。当用户输入下一个字母时,上一个字母对应的搜索请求已经没意义了,直接取消掉,只处理最后一次输入的请求。这能极大节省网络和计算资源。

,