问题描述
我想为不同的 Flow 类型请求两次,然后在单个实时数据中添加结果以进行观察。 但只能得到第一个结果。
ParentModel 是 Note 和 FolderWithNote 数据类的父级。
val allItems: mutablelivedata<List<ParentModel>> = mutablelivedata()
fun getAllItems() {
viewmodelScope.launch {
noteRepository.getFoldersWithNotes()
.collect {
allItems.postValue(it)
}
noteRepository.getAllNotes()
.map {
databaseNoteMapper.mapFromEntityList(it)
}
.collect {
allItems.postValue(it)
}
}
}
我在片段中观察到这样
viewmodel.allItems.observe(viewLifecycleOwner,{
adapter.setItems(it)
})
我想在我的 recyclerView 中显示所有 Notes 和 Folderwithnotes,我在我的 Recycler 适配器中处理它们的不同绑定。
解决方法
这是肯定的,因为第一个 Flow collect 会阻塞等待数据库返回的数据。需要打开两个子协程来完成Flow的collect,而不是全部放在一个子协程中。
编辑
使用异步进行并发。 await 获取 future 对象,合并并发结果并发送给 LiveData。
fun getAllItems() {
viewModelScope.launch {
val folds = viewModelScope.async {
noteRepository.getFoldersWithNotes()
}
val notes = viewModelScope.async {
noteRepository.getAllNotes()
.map {
databaseNoteMapper.mapFromEntityList(it)
}
}
allItems.postValue(folds.await() + notes.await())
}
}