2016-05-21 26 views
0

タイトルが少し曖昧だとわかりましたが、私が持っている問題はかなり複雑です(私にとっては少なくとも)。RxAndroid Observable Populateサブリスト

APIからリストをロードするObservableがあります。ユーザの応答は、このようになります。

{ 
    "status": "Successful", 
    "count": 2, 
    "response": [{ 
     "_id": "abc", 
     "email": "[email protected]", 
     "surname": "Surname", 
     "firstname": "Firstname", 
     "posts": [ 
      "123", 
      "456", 
      "789"] 
     }] 
    ,... 
} 

をして、ポストの応答を:

{ 
    "status": "Successful", 
    "count": 7, 
    "response": [{ 
      "_id": "123", 
      "name": "Post 1" 
     }, { 
      "_id": "456", 
      "name": "Post 2" 
     }, { 
      "_id": "789", 
      "name": "post 3" 
     }] 
} 

私はすでに正しく応答をマッピングしObservable<Post>を返すメソッドを持っています。

今私が持っている問題:私はposts IDのリストで、ユーザーのリストを取得することができますが、私は私が私の方法(Observable<Post> getPost(String id))

Iから照会することができ、実際のオブジェクトと、そのリストを移入したいです

これまでのところ、レスポンスをList<User>にマップするためには、リスト内の各ユーザーについて、IDに関連付けられたPostsを取得する必要がありますList<String

public Observable<List<User>> getUsers() { 
    return apiService.getUsers() 
      .flatMap(userResponse -> Observable.from(userResponse.users).toList()) 
      .flatMap(user -> Observable.from(users)) 
      .toList(); 
} 

上記はList<User>で、これは私が必要とするものです。私が実行し続ける問題は、各Postアイテムを発行し、最終的にはすべて3つのUserアイテム(すべての最初のユーザー)を返します。では、リスト内の各アイテムのポストを取得し、実際のポストを表すモデル内の別のリストに適用するために、いくつかの変換を実行する方法はありますか?

おかげで、混乱して申し訳ありません。私はRxJavaを初めて使っています。

EDIT: が解決 -

+0

た後でも、私は解決策を見つけた(EDITをチェックする) – Boots

答えて

0

以下の答えをチェックし[OK]を、最終的にそれを解決するために管理。興味のある方、HERESに解決策について:

public Observable<List<Posts>> getPostsForUser(User user) { 
    return Observable 
      .from(user.posts) 
      .flatMap(this::getPost) 
      .toList(); 
} 
が続いているユーザーのリストを取得するときに、次のようにすることを使用: は、私は、ユーザーの投稿のリストを取得するためのメソッドを持っていた

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