2017-10-13 14 views
0

私はリストを反復し、結果を返す前にそれらを結合したいプロジェクトで作業していました。基本的にはPostResponseオブジェクトをPostに変換しようとしています。RxJava2はtoListの後にdoOnNextを受け取っていません

いくつかの関連コード。

Post.java

public class Post { 
    @NonNull private User user; 
    @NonNull private String title; 
    @NonNull private String body; 
    @NonNull private Integer id; 
} 

PostResponse.java

public final class PostResponse{ 
    private Integer userId; 
    private Integer id; 
    private String title; 
    private String body; 
} 

投稿

@Override public Observable<List<Post>> posts() { 
     return postDataStore.getAllPosts() 
       .flatMap(postResponses -> Observable.fromIterable(postResponses) 
         .flatMap(postResponse -> postDataMapper.transform(postResponse)) 
         // Receiving output here 
         .doOnNext(post -> Log.i(TAG, "posts: " + post)) 
         .toList() 
         .toObservable() 
         // Not Receiving output here 
         .doOnNext(posts -> Log.i(TAG, "posts: " + posts))); 
    } 

は、上記と呼ばれる変換関数を取得します。

public Observable<Post> transform(final PostResponse postResponse) { 
     return Observable.create(emitter -> { 
      final Post post = new Post(postResponse.getId()); 
      post.setTitle(postResponse.getTitle()); 
      post.setBody(postResponse.getBody()); 
      userRepository.user(postResponse.getUserId()).doOnNext(user -> { 
       post.setUser(user); 
       emitter.onNext(post); 
      }).subscribe(); 
     }); 
    } 

しかし、私はposts()に加入しているdoOnNext上の任意のデータを受信して​​いませんよ。何が間違っているか分かりません。

私が本当にばかげた間違いをしている場合、私の謝罪。私は、デザインとロジックを再考することをお勧めします、

emitter.onComplete();

右あなたのemitter.onNext(post);

後しかし:

+0

'postDataStore.getAllPosts()'を、100%にデータがある何らかのデータソースで置き換えます。リストから見て、チェックしてください。 'onNext'で何かを取得した場合は、' postDataStore'が何も返さないことを意味します。 – Divers

+0

混乱して申し訳ありません。私は質問を編集して、はるかに明確にする必要があります。 'getAllPosts'はうまくいっていました。 – riteshakya037

+0

'toList()'演算子は、observableが完了することを必要とします。あなたの観測は完全ですか? –

答えて

1

クイックフィックスを追加することです。特に、変換では新しいObservableを作成する必要はありません。私はこのような何かにあなたのtranform方法を再設計します:あなたは、新しいObservableを作成するには避けるあなたは、内側のサブスクリプションを避けるこのように

Observable<Post> transform(PostResponse postResponse) { 
    return userRepository.user(postResponse.getUserId()) 
     .map(user -> parseResponse(parseResponse, user)); 
} 


Post parseResponse(PostResponse response, User user) { 
    final Post post = new Post(postResponse.getId()); 
    post.setTitle(postResponse.getTitle()); 
    post.setBody(postResponse.getBody()); 
    post.setUser(user); 

    return post; 
} 

を、あなたは結果のための単一の制御ポイントを持って、それは、サブスクリプションであります最終結果がObservableであった。

+0

私ははるかに明確な解決に同意します。ありがとう – riteshakya037

関連する問題