2016-09-11 4 views
0

で複数のフラットマップの結果:ソートRXJava

public List<BatchResponse> getAllPosts() { 
    BatchRequests<BatchRequest> batch = new BatchRequests<>(); 
    batch.add(new BatchRequest(RequestMethod.GET, "USERID/feed?limit=5")); 
    batch.add(new BatchRequest(RequestMethod.GET, "USERID2/feed?limit=5")); 
    List<BatchResponse> results = facebook.executeBatch(batch); 
    return results; 
} 

それから私は、コードを解析するRXJavaを使用しています:

Observable.defer(() -> Observable.just(getAllPosts())) 
     .subscribeOn(Schedulers.io()) 
     .flatMap(Observable::from) 
     .map(BatchResponse::asResponseList) 
     .flatMap(Observable::from) 
     .map(rawPost -> DataObjectFactory.createPost(rawPost.toString())) 
     .toSortedList(MainActivity::compareModel) 
     .flatMap(Observable::from) 
     .map(Post::getMessage) 
     .subscribe(Log::v, Throwable::printStackTrace); 

私は私の問題はそれだけですべての投稿をして並べ替えますが、それはありませんということですthis advice

private static Integer compareModel(Post car1, Post car2) { 
    return car1.getCreatedTime().compareTo(car2.getCreatedTime()); 
} 

を使用して、それを並べ替えてみました1人のユーザーの投稿を並べ替えます(/ 1つのバッチリクエスト)。フラットマップのため、バッチリクエストが連続して実行されるためです。私はそれを解決する方法を知らない。

答えて

1

私はあなたの問題がflatMapの問題ではないと思います。 toSortedListは、あなたのObservableが完了するまで待つ必要があります。あなたは(直前例えばdoOnNext(evt -> /** log something **/)のおかげで、いくつかのログを追加することもできます。

私はあなたがasReponseListcreatePost方法を返すかどうか確認したいかもしれないと思う。それはすべてのものを返さないことがあります。

を使用してコードを怒鳴る見つけてください。いくつかの小さなアップデート(flatMap(Observable::from)と同じことをするflatMapIterableを参照)

Observable.fomCallable(() -> getAllPosts()) 
      .subscribeOn(Schedulers.io()) 
      .flatMapIterable(l -> l) 
      .flatMapIterable(BatchResponse::asResponseList) 
      .map(rawPost -> DataObjectFactory.createPost(rawPost.toString())) 
      .doOnNext(evt -> LOGGER.debug(evt)) 
      .toSortedList(MainActivity::compareModel) 
      .flatmapIterable(l -> l) 
      .map(Post::getMessage) 
      .subscribe(Log::v, Throwable::printStackTrace);