考虑以下方法:
// Returns a Flows of integers. Each integer is a unique id for a Foo.
// Emits a new integer whenever the current Foo changes.
suspend fun getCurrentFooId(): Flow<Int>
// Returns a Foo.
// Emits a new Foo if the internal state of the last Foo changes.
suspend fun getFooForId(int: fooId): Flow<Foo>
我需要的是一个Flow<Foo>
,如果当前Foo
id更改***或***当前Foo
的内部状态更改,则会发出新的Foo
。
我不能只合并Flow
s,因为我不能调用getFooForId()
,直到***在***之后我开始收集第一个Flow
(因为它提供了Foo
id)。
我应该使用通道流来并发合并它们吗?或者有更好的方法吗?
1条答案
按热度按时间46scxncf1#
那会是
“平面Map”意味着对于源流中的每个项,从lambda发出所产生的流的所有项。而“latest”意味着每当源流发出一个新值时,就向前跳到新产生的流。
实际上,这两个函数不应该标记为
suspend
。它通常不需要调用任何阻塞或挂起函数来产生流,并且能够在不需要在协同程序中执行的情况下获得流,这要灵活得多。通常,您可能希望使用launchIn
获取流并收集它,这样就不必将其嵌套在协程中,或者使用shareIn
创建热流。如果你要把它赋给一个类属性,这个函数特别有用。