kotlin 当我将.take(2)应用于Flow时会发生什么?

amrnrhlw  于 2023-05-07  发布在  Kotlin
关注(0)|答案(1)|浏览(183)

我使用handleMInfo.listIncompleted()和Room从数据库中获取记录,listIncompleted返回Flow
1:我认为代码A会继续运行,当数据库中的记录发生变化时,todo(it)会一次又一次地启动,对吗?
2:我认为即使在Code B中数据库中的记录发生了变化,todo(it)只被调用了两次,整个操作也会被取消,对吗?

代码A

val listIncompleted = handleMInfo.listIncompleted()        
    
listIncompleted
   .flowOn(Dispatchers.IO)           
   .collect { todo(it) }

代码B

val listIncompleted = handleMInfo.listIncompleted()        
    
listIncompleted
   .flowOn(Dispatchers.IO)
   .take(2)
   .collect {  todo(it) }
kpbwa7wx

kpbwa7wx1#

1.这是正确的每次在数据库中添加或更新新记录时,只要流仍然处于活动状态,就会调用todo(it)。每当数据库中发生更改时,listIncompleted()函数返回的Flow就会发出值,从而导致collect块为每个新发出的值执行。
1.那也是正确的。在Code B中,collect块只会被调用两次,然后流程会被取消take()操作符用于限制流将发出的值的数量。因此,在您的情况下,流将在发出2个值后被取消。

相关问题