在RXJava中对多个平面映射的结果排序



我用以下代码(facebook4j库)获取facebook帖子:

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

我试着用这个建议来排序

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

我的问题是,它不排序所有的帖子,但它只排序一个用户(/一个批处理请求)的帖子。我认为这是因为批量请求被连续执行,因为平面映射。我不知道怎么解决这个问题

我不认为你的问题是flatMap的问题。toSortedList必须等待您的Observable完成后才能进行排序。您可能需要在之前添加一些日志(例如,感谢doOnNext(evt -> /** log something **/))。

我认为你可能要检查什么返回asReponseListcreatePost方法。它可能不会返回所有内容。

请找到下面你的代码与一些小的更新(见flatMapIterable做同样的事情作为flatMap(Observable::from))

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

相关内容

  • 没有找到相关文章

最新更新