我需要执行多个http请求和一个数据库查询来过滤数据。
我使用的是Rxjava的zip操作符。
我做了以下工作来准备我的多个http请求
List<Observable<List<Picture>>> requests = new ArrayList<>();
for(String id : photoIds) {
requests.add(pictureRepository.searchPicture(id).toObservable());
}
我做了以下工作来准备我的数据库请求
Observable<List<Favourite>> favourites = pictureRepository.getFavourites().toObservable();
我试着创建观察器,但rxjava不接受我的代码。
Observable.zip(
requests, favourites,
new BiFunction<Object[], List<Favourite>, List<FavouritePictures>>() {
@Override
public List<FavouritePictures> apply(Object[] t1, List<Favourite> t2) throws Exception {
return /*here I want to check the favourites and return a list*/;
}
}
);
有什么方法可以实现吗?谅谅
以下是一个可能有效的解决方案。
val photoIds = listOf(1, 2, 3)
var index = 0
Observable.just(0).flatMapSingle {
pictureRepository.searchPicture(photoIds[index])
index += 1
}.repeatUntil {
index + 1 == photoIds.size - 1
}.toList().zipWith(pictureRepository.getFavourites(),
BiFunction { listOfPictures, listOfFavoratePictures ->
// Return your list
})
你也可以用递归的方法来实现,但我个人觉得这样更易读。