如何使用流和协程在循环内收集数据

Raf*_*lva 4 android kotlin kotlin-coroutines

我是使用流程和协程的新手,我希望您能帮助我解决以下问题:

我有返回 Flow 的useCases.getScheduleList()和方法。useCases.getScheduleDetails()我需要调用useCases.getScheduleList()以获取日程列表,然后调用useCases.getScheduleDetails()日程列表中的每个项目。以下是我的尝试:

    viewModelScope.launch {
        useCases.getScheduleList().collect {
            val scheduleList = it
            val schedulesWithDetails = arrayListOf<ScheduleWithDetails>()

            for (schedule in scheduleList) {
                launch {
                    useCases.getScheduleDetails(schedule.code)
                        .collect { detail ->
                            schedulesWithDetails.add(
                                newScheduleWithDetail(
                                    schedule,
                                    detail.body
                                )
                            )
                        }
                }
            }

            // updateUI is called before collect add items to schedulesWithDetails
            updateUI(schedulesWithDetails)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我可以收集列表,还可以收集列表中每个项目的详细信息,并将结果添加到我的列表中,schedulesWithDetails但我无法使用schedulesWithDetails已添加的数据,因为该updateUI()方法不会等待收集过程完成然后被执行。

任何人都可以帮我解决这个问题的想法/建议吗?

Nag*_*obi 6

试试这个:

viewModelScope.launch {
    useCases.getScheduleList().map { scheduleList ->
        scheduleList.map { async { useCases.getScheduleDetails(it).first() } }.awaitAll()
    }.collect { schedulesWithDetails ->
        updateUi(schedulesWithDetails)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,在映射内部使用 `async` 然后在映射之后使用 `awaitAll()` (2认同)