Kotlin协程并行化

时间:2020-09-07 12:33:48

标签: kotlin kotlin-coroutines

我在并行启动协程时遇到一些麻烦。

我有一些代码在协程中发出网络请求,该网络请求返回中间结果的集合,我希望并行(即不顺序地)获取此集合中每个项目的完整结果。 / 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将旧的回调样式代码包装到暂停函数中。

0 个答案:

没有答案