首页 文章

RxAndroid Observable填充子列表

提问于
浏览
0

所以我意识到 Headers 有点模糊,但我遇到的问题非常复杂(至少对我而言) .

我有一个Observable从API加载一个列表 . 用户响应类似于:

{
    "status": "Successful",
    "count": 2,
    "response": [{
        "_id": "abc",
        "email": "email@email.com",
        "surname": "Surname",
        "firstname": "Firstname",
        "posts": [
            "123",
            "456",
            "789"]
       }]
    ,...
}

然后对帖子回复:

{
    "status": "Successful",
    "count": 7,
    "response": [{
            "_id": "123",
            "name": "Post 1"
        }, {
            "_id": "456",
            "name": "Post 2"
        }, {
            "_id": "789",
            "name": "post 3"
        }]
}

我已经有一个方法返回一个正确映射响应的 Observable<Post> .

现在我遇到的问题是:我可以使用 posts id的列表获取用户列表,但我想用我可以从我的方法查询的实际对象填充该列表( Observable<Post> getPost(String id))

我尝试了各种各样的方法,但没有任何作用 .

到目前为止,我有以下内容将响应映射到 List<User> - 我希望,对于列表中的每个用户,获取与 List<String 中的ID关联的 Posts

public Observable<List<User>> getUsers() {
    return apiService.getUsers()
            .flatMap(userResponse -> Observable.from(userResponse.users).toList())
            .flatMap(user -> Observable.from(users))
            .toList();
}

上面发出 List<User> ,这就是我需要的 . 我一直遇到的问题是,它会发出每个Post项,最终只返回3个User项,都是相同的(第一个用户) . 那么如何执行一些转换来获取列表中每个项目的帖子,并将其应用到代表实际帖子的模型中的另一个列表?

谢谢,并为这种混乱感到抱歉 - 我是RxJava的新手,所以需要一段时间来解决这个问题 .

编辑:解决 - 检查下面的答案

1 回答

  • 0

    好的,终于设法解决了 . 对于那些感兴趣的人,下面是解决方案:我有一个方法来获取用户的帖子列表:

    public Observable<List<Posts>> getPostsForUser(User user) {
        return Observable
                .from(user.posts)
                .flatMap(this::getPost)
                .toList();
    }
    

    然后在获取用户列表时使用它,如下所示:

    public Observable<List<User>> getPopulatedUser() {
        return apiService.getUsers()
                .flatMap(userResponse -> Observable.from(userResponse.users).toList())
                .flatMap(Observable::from)
                .flatMap(user -> getPostsForUser(user)
                        .map(posts -> {
                            user.setPosts(posts);
                            return (User) user;
                        })
                ).toList();
    }
    

相关问题