2016-05-21 43 views
0

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

+0

Nach noch mehr basteln, ich fand die Lösung (check EDIT) – Boots

Antwort

0

Ok, es endlich geschafft, es zu lösen. Für Interessenten, heren der Lösung: hatte ich eine Methode, um die Liste der Beiträge für den Benutzer zu erhalten:

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

Dann das verwendet wird, wenn die Liste der Benutzer immer wie folgt:

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(); 
} 
Verwandte Themen