我有几个api调用(顺序,异步),其中一些返回列表。我的api界面如下所示。
@GET("/users/settings")
Observable<UserWrapper> getUserSettings();
@GET("/{username}/collections")
Observable<List<Item>> getItems(@Path("username") String userName);
@GET("/item/{id}")
Observable<ItemInfo> getItemInfo(@Path("id") int id);
@GET("/{username}/friends")
Observable<List<Friend>> getFriends(@Path("username") String userName);
这是我想要按顺序执行的操作:
UserWrapper
getUserSettings()
saveUser(userWrapper)
getItems(userWrapper.getUserName())
getItemInfo(item.getId())
itemInfo
saveItem(itemInfo)
getFriends(userWrapper.getUserName())
saveFriend(friend)
现在我是RxJava的新手,不知道如何处理列表。我看了一个Jake Wharton's slides,发现他使用了一个函数flattenList()
,但我不知道它的定义。如果你能帮助创作这个链条,那就太好了。
更新1
这是我现在所拥有的:
mApiService.getUserSettings()
.map(this::saveUser)
.flatMap(userWrapper -> mApiService.getItems(userWrapper.getUserName()));
.flatMapIterable( ? "How to iterate for each item" ? );
更新2
我正在尝试写这样的东西
mApiService.getUserSettings()
.map(this::saveUser)
.flatMap(userWrapper -> mApiService.getItems(userWrapper.getUserName()))
.someMethodToIterateThroughEachItem(item -> mApiService.getItemInfo(item))
.map(this::saveItem)
.someMethodThatCanCallUserWrapperAgain(userWrapper -> mApiService.getFriends(userWrapper.getUserName()))
.someMethodToIterateThoughEachFriend(friend -> saveFriend(friend))
答案 0 :(得分:20)
RxJava添加了flatMapIterable
。所以你现在不需要flattenList
。如,
Observable<UserWrapper> o =
getUserSettings()
.doOnNext(this::saveUser)
.flatMap(user -> getItems(user.getUserName())
.flatMapIterable(items -> items)
.flatMap(item -> getItemInfo(item.getId()))
.doOnNext(this::saveItem)
.toList()
.map(ignored -> user))
.flatMap(user -> getFriends(user.getUserName())
.flatMapIterable(friends -> friends)
.doOnNext(this::saveFriend)
.toList()
.map(ignored -> user)
);
o.subscribe(...);