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

标签 android kotlin kotlin-coroutines

我是使用流和协程的新手,希望您能帮我解决以下问题:
我有 useCases.getScheduleList()useCases.getScheduleDetails()返回 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)
        }
    }
}
在上面的代码中,我可以收集 list ,还可以收集 list 中每个项目的详细信息,并将结果添加到我的 schedulesWithDetails但我不能使用 schedulesWithDetails已添加数据,因为 updateUI()方法不等待收集过程完成然后执行。
谁能帮我解决这个问题的想法/建议?

最佳答案

试试这个:

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

关于android - 如何使用流和协程在循环内收集数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67535464/

相关文章:

android - 我是否需要在 Android 4.1 及更早版本上明确声明 WRITE_EXTERNAL_STORAGE 权限?

java - 我似乎无法让我的 fragment 在不崩溃的情况下加载 webview

android - 旋转 Google map 中的两层标记图标

kotlin - 何时为类中的协程指定 Dispatchers.xxx

kotlin - 为什么这段协程代码不打印任何内容?

java - 我的java立即初始化缺少什么?

android - 当我们上下滚动recyclerView时隐藏和显示 View 组

android - Android 中的 ART 和 DART 是什么

kotlin - 发生错误时防止停止Kotlin流

android - Kotlin 协程处理错误和实现