我正在开发一项功能,该功能需要根据本地数据库数据过滤出网络响应数据。
例如,我的网络层返回一个项目列表,而我的数据库层返回一个可观察到的ID列表。现在,我只想从ID匹配数据库层响应中任何人的网络层返回那些对象。
下面的代码从网络中获取数据,并将结果保存到数据库(缓存)中。
factory.getRemoteDataStore()
.searchForVenues(query)
.toObservable()
.distinctUntilChanged()
.flatMap { venues ->
factory.getCacheDataStore()
.saveVenues(venues)
.andThen(Observable.just(venues))
}
我还有一种方法可以返回需要过滤的场所列表
factory.getCacheDataStore().getDislikedVenues()
现在,如何扩展上一个链以使用getDislikedVenues()Observable从网络响应的响应中过滤掉它们?
很抱歉遇到这样的菜鸟问题,我真的为此感到困惑。
答案 0 :(得分:0)
一种实现方法是
factory.getCacheDataStore().getDislikedVenues()
.flatMap { dislikedItems ->
factory.getRemoteDataStore()
.searchForVenues(query)
.toObservable()
.distinctUntilChanged()
.flatMapIterable { it }
.filter { !dislikedItems.contains(it.id) }
.toList()
.toObservable()
}
.flatMap { venues ->
factory.getCacheDataStore()
.saveVenues(venues)
.andThen(Observable.just(venues))
}
P.S .:据我了解,factory.getRemoteDataStore().searchForVenues(query)
返回Single
或Maybe
。在这种情况下,distinctUntilChanged()
无法工作,因为它依赖于多次发射(onNext()
),但是Single
或Maybe
只能发射一个结果。