【发布时间】:2018-10-09 20:11:15
【问题描述】:
如何将 observables 发出的多个结果组合成一个结果并发出一次?
我有改造服务:
public interface MyService {
@GET("url")
Observable<UserPostsResult> getUserPosts(@Query("userId") int id);
@GET("url")
Observable<UserPostsResult> getUserPosts(@Query("userId") int id, @Query("page") int pageId);
}
我有一个模型:
public class UserPostsResult {
@SerializedName("posts")
List<UserPost> mPosts;
@SerializedName("nextPage")
int mPageId;
}
我还有 ids List<Integer> friendsIds;
我的目标是有一个像这样的方法:
public Observable<Feed> /*or Single<Feed>*/ getFeed(List<Integer> ids) {
...
}
它返回一个 Observable 或 Single,它执行以下操作:
- 将所有
getUserPosts(idFromList)合并为一个可观察对象 -
对于每个
UserPostsResult必须做的:if (userPostResult.mPageId > -1) getUserPosts(currentUserId, userPostResult.mPageId);并将这个结果合并到之前的
userPostResult 返回一个模型作为所有操作的结果。
结果类:
public class Feed {
List<UserPost> mAllPostsForEachUser;
}
编辑(更多细节):
我的客户规范是我必须从社交网络用户帖子中获取,无需登录,无需令牌请求。所以我必须解析 HTML 页面。这就是为什么我有这个复杂的结构。
编辑(部分解决方案)
public Single<List<Post>> getFeed(List<User> users) {
return Observable.fromIterable(users)
.flatMap(user-> mService.getUserPosts(user.getId())
.flatMap(Observable::fromIterable))
.toList()
.doOnSuccess(list -> Collections.sort(list, (o1, o2) ->
Long.compare(o1.getTimestamp(), o2.getTimestamp())
));
}
此解决方案不包括页面问题。这就是为什么它只是部分解决方案
【问题讨论】:
标签: java android retrofit rx-java2