使用RxJava将一个Observable中的数据拼接到另一个Observable中

时间:2017-03-23 16:05:19

标签: rx-java observable rx-android reactivex

我有两个类型为UserImage的可观察流:

final Observable<List<Image>> images = mNetworkingService.getImages(getToken(context));

final Observable<List<User>> users = mNetworkingService.getUsers()
.onErrorReturn(new Func1<Throwable, List<User>>() {
    @Override
    public List<User> call(Throwable throwable) {
        return Collections.emptyList();
    }
});

我想根据图像和用户对象中包含的fullName为每个图像对象的userId字段分配用户的名字和姓氏。

这是我到目前为止所做的,但不确定 zip 是否是最佳选择。我很接近,但当我尝试返回图像对象的集合时,我得到一个错误,因为它期望一个List图像,但认为它只是一个图像对象。如果有更好/更清晰的方式来完成这种关联/分配,我会感兴趣。

return Observable.zip(images, users, 
new Func2<List<Image>, List<User>, Observable<List<Image>>>() {
    @Override
    public Observable<List<Image>> call(final List<Image> images, List<User> users) {
        for (Image image : images) {
            for (User user : users) {
                if (image.userId.equals(user.userId)) {
                    image.fullName = user.getFullName();
                }
            }
        }
        return Observable.from(images); // Error: Expecting List<Image> but got Image.
    }
}).flatMap(new Func1<Observable<List<Image>>, Observable<List<Image>>>() {
    @Override
    public Observable<List<Image>> call(Observable<List<Image>> it) {
        return it;
    }
});

1 个答案:

答案 0 :(得分:1)

如果您想在两个请求完成后执行操作,

zip()是正确的选项。

from()Iterable<T>作为参数并将其展平为T的Observable,这意味着它将分别发出每个项目,这意味着 Observable.from(images)返回Observable<Image>,而您将zipper方法定义为返回Observable<List<Image>>,因此存在您的不匹配和编译错误。

但是,无论如何,你不应该从拉链方法返回Observable,因为拉链只是希望你将你得到的多个对象转换为单个对象。
对于2个物品的每个“拉链”发射它将执行拉链,你将得到onNext()所得到的拉链对象,但在你的情况下,你将发出可观察的对象与每个{ {1}},这可能不是你想要的。

总而言之,你应该想要这样的东西:

onNext()