【发布时间】:2021-08-25 11:36:32
【问题描述】:
我可以在 kotlin flow 中使用 async{} 吗?
场景:在 API 调用之后,我得到了一个包含 200 个对象的列表,我需要解析(转换为 UIObject)。 我正在尝试并行处理此列表。 下面是伪代码:
fun getUIObjectListFlow():Flow<List<UIObject>> {
flow<List<UIObject>> {
while (stream.hasNext()) {
val data = stream.getData() // reading from an input stream. Data comes in chunk
val firstHalfDeffered = async(Dispatchers.IO) { /* process first half of the list that data obj contains*/ }
val secondHalfDeffered = async(Dispatchers.IO) { /*process second half of the list that data obj contains */ }
val processedList = firstHalfDeffered.await() + secondHalfDeffered.await() // just pseudo code
emit(processedList)
}
}
}
由于 async{} 需要协程范围(例如: someScope.async{} ),我怎样才能在 flow 中获得范围?有没有其他方法可以做到这一点?
此函数在存储库中,我从 viewmodel 中调用它。
谢谢
【问题讨论】:
-
如果只返回单个项目(即列表),为什么要首先使用流?如果您计划异步发出
UIObject项目,那么您上面的代码不会这样做 - 它会等待所有项目,然后一次发出所有项目。物品的顺序重要吗? -
@broot :知道了。在实际代码中,我正在读取流并发出对象而不是 List
。我可以看到我的示例代码与我的问题不符。我会更新伪代码。 -
在这种情况下,乔佛里的答案是正确的。您只需将流程主体包含在
coroutineScope { ... }中。
标签: android kotlin kotlin-coroutines kotlin-flow