我有一个使用Room来保存我的收藏夹的Android应用。
这是我的DAO:
@Query("SELECT * FROM favorites ORDER BY lastConsultation DESC")
fun getAll() : Flowable<List<Favorite>>
我想使用Flowable使我的MainActivity在每次添加或删除收藏夹时得到通知。
在MainActivity上,我想检索所有我的收藏夹并发出网络请求以检查有关我的收藏夹的一些信息。
在UseCase中,我有以下代码可以拨打电话
favoritesRepository.getAll()
.flatMap { Flowable.just(it) }
.concatMapEager { Flowable.fromIterable(it) }
.concatMapEager {
itemRepository.getItem(it.id)
.toFlowable()
}
.toList()
.toFlowable()
在调用itemRepository
时Single
返回一个getItem
。我从Flowable<List<Favorite>>
中检索了favoritesRepository
,并希望在提出网络请求后将“收藏夹”中的每个收藏夹都打开,我的方法返回一个Flowable<List<Item>>
我认为添加.flatMap { Flowable.just(it) }
会创建一个新的Flowable,一旦该项目被发射出去,它就会发射onComplete(因为Room不会发射onComplete)。
那段代码不起作用,永远不会调用onComplete,因此也不会调用.toList()
。
在保持Flowable实现的同时(我可以使用Single摆脱问题,但在MainActivity上丢失“自动通知”)是否可以实现这些调用(并发,因此concatMapEager)?
答案 0 :(得分:1)
我将假设realtyRepository
返回一个Single
。试试这个。
favoritesRepository
.getAll()
.switchMapSingle { Flowable
.fromIterable(it)
.concatMapEager { realtyRepository.getRealty(it.id).toFlowable() }
.toList()
}
这将得到我想要的信息,但是当数据库更改时,您仍然会收到通知。另外,switchMapSingle
将确保如果同时进行任何数据库更新,您正在进行的任何工作都将被取消。