У меня такой код:
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
, за которым следует плоская карта, но тогда все становится запутанным.
Любая помощь?
Если вы хотите загружать своих пользователей из 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()
}
}