我在并行启动协程时遇到一些麻烦。
我有一些代码在协程中发出网络请求,该网络请求返回中间结果的集合,我希望并行(即不顺序地)获取此集合中每个项目的完整结果。 / p>
以下是相关的API:
data class IntermediateResult(val id: Long)
data class FinalResult(val id: Long, val name: String)
suspend fun getIntermediateResults() : Collection<IntermediateResult>
suspend fun getFinalResult(id: Long) : FinalResult
这是使用API的代码(它位于ViewModel中):
fun example() {
viewModelScope.launch(Dispatchers.IO) {
val intermediateResults = getIntermediateResults()
intermediateResults.forEach { intermediateResult ->
viewModelScope.launch(Dispatchers.IO) {
val finalResult = getFinalResult(intermediateResult.id)
// Update cache and post updated cache to the UI via live data
}
}
}
}
据我了解,在forEach
循环中启动新的协程将导致以并行方式获取每个项目的最终结果(即不会在{{1}上“等待”) },直到继续进行forEach的下一次迭代为止,但是,我观察到的是它是按顺序发生的(即在forEach循环中对getFinalResult
的调用导致代码“等待”,直到结果返回之前开始下一次迭代。
换句话说,我不在乎最终结果以迭代顺序返回中间结果。
如果相关(我很确定不是),则两个暂停函数的实现将使用getFinalResult
将旧的回调样式代码包装到暂停函数中。