首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用RxJava2将api中的数据合并到域对象中?

如何使用RxJava2将api中的数据合并到域对象中?
EN

Stack Overflow用户
提问于 2018-09-13 05:37:51
回答 1查看 73关注 0票数 1

我有以下代码:

代码语言:javascript
复制
interface UsersApi {
  fun getUsers() : Single<List<UserTO>>
  fun getPosts(postId: String) : Single<PostTO>
}
data class UserTO(val name: String, postIds: List<String>)
data class PostTO(val title: String, val content: String)
data class User(val name: String, val posts: List<Post>)
data class Post(val title: String, content: String)

我正在尝试使用一个方法编写一个存储库类,该方法返回

代码语言:javascript
复制
Single<List<User>>

但我不知道该怎么做,因为我需要访问流中较早的对象,而且Single也很混乱。

我非常确定我必须从调用getUsers开始,然后是一个平面地图,但之后事情就变得混乱了。

有什么帮助吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-13 06:46:23

如果你想从API加载你的用户,并为每个用户加载他们的帖子,那么你可以像下面这样做。

flattenAsFlowable允许您从您的UserTO响应中迭代每个api。这样,您就可以提取它们的postIds并映射到User对象。

Flowable.fromIterable允许您遍历postIds集合并为每个帖子执行api调用。

代码语言:javascript
复制
class MyRepository(private val api: UsersApi) {

    fun getUsers(): Single<List<User>> {
        return api.getUsers()
            .flattenAsFlowable { it }
            .flatMapSingle { loadUserPosts(it) }
            .toList()
    }

    private fun loadUserPosts(user: UserTO): Single<User> {
        return loadPosts(user.postIds)
            .map { User(name = user.name, posts = it) }
    }

    private fun loadPosts(postIds: List<String>): Single<List<Post>> {
        return Flowable.fromIterable(postIds)
            .flatMapSingle { api.getPosts(it) }
            .map { Post(title = it.title, content = it.content) }
            .toList()
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52303830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档