Also ich weiß, der Titel ist ein bisschen vage, aber das Problem, das ich habe, ist ziemlich kompliziert (für mich zumindest).RxAndroid Observable Auffüllen Unterlisten
Ich habe ein Observable, das eine Liste von einer API lädt. Die Benutzerantwort ähnelt dies:
{
"status": "Successful",
"count": 2,
"response": [{
"_id": "abc",
"email": "[email protected]",
"surname": "Surname",
"firstname": "Firstname",
"posts": [
"123",
"456",
"789"]
}]
,...
}
und dann für die Beiträge Antwort:
{
"status": "Successful",
"count": 7,
"response": [{
"_id": "123",
"name": "Post 1"
}, {
"_id": "456",
"name": "Post 2"
}, {
"_id": "789",
"name": "post 3"
}]
}
ich bereits eine Methode, die eine Observable<Post>
zurückgibt, die die Antwort korrekt abbildet.
Jetzt ist das Problem habe ich: Ich kann eine Liste von Benutzern, mit der Liste der posts
ids holen, aber ich möchte mit den eigentlichen Objekten diese Liste füllen, die ich von meiner Methode abfragen kann (Observable<Post> getPost(String id))
I habe alle möglichen Ansätze probiert, aber nichts geht ..
Bisher habe ich folgendes um die Antwort auf eine List<User>
abzubilden - und ich möchte für jeden Benutzer in der Liste die Posts
mit der ID verknüpfen in der List<String
:
public Observable<List<User>> getUsers() {
return apiService.getUsers()
.flatMap(userResponse -> Observable.from(userResponse.users).toList())
.flatMap(user -> Observable.from(users))
.toList();
}
Das obige emittiert eine List<User>
, was ich brauche. Das Problem, auf das ich immer wieder stoße, ist, dass es jedes Post-Item ausgibt und schließlich nur 3 User-Items zurückgibt, alle gleich (der erste User). Wie kann ich einige Transformationen durchführen, um die Posts für jedes Element in der Liste zu erhalten, und sie auf eine andere Liste innerhalb des Modells anwenden, das den eigentlichen Post darstellt?
Danke, und Entschuldigung für die Verwirrung - ich bin neu in RxJava, also dauert es eine Weile, um meinen Kopf um alles zu wickeln.
EDIT: Gelöst - überprüfen Antwort unten
Nach noch mehr basteln, ich fand die Lösung (check EDIT) – Boots