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

How to collect data inside a loop using flow and coroutines

我刚开始使用流程和协程,希望您能帮助我解决以下问题:

我有 useCases.getScheduleList()useCases.getScheduleDetails() 方法 return Flow。我需要调用 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)
        }
    }
}

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

谁能帮我解决这个问题ideas/suggestions?

试试这个:

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