Как объединить данные из API в доменные объекты с помощью RxJava2? - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть следующий код:

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)

Я пытаюсь написать класс репозитория с методом, который возвращает

Single<List<User>>

Но я понятия не имею, как это сделать,так как мне нужен доступ к более ранним объектам в потоке, а также Single, это сбивает с толку.

Я почти уверен, что мне нужно начать с вызова getUsers, за которым следует плоская карта, но затем всезапутаться.

Любая помощь?

1 Ответ

0 голосов
/ 13 сентября 2018

Если вы хотите загрузить своих пользователей из API и для каждого пользователя загрузить их сообщения, вы можете сделать что-то вроде следующего:

flattenAsFlowable позволяет вам повторять каждое UserTO из вашего ответа API.При этом вы можете извлечь их postIds и сопоставить их с объектом User.

Flowable.fromIterable позволяет перебирать коллекцию postIds и выполнять вызов API для каждого сообщения.

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()
    }
}
...