如何使用流和协程在循环内收集数据
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)
}
}
我刚开始使用流程和协程,希望您能帮助我解决以下问题:
我有 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)
}
}