I have couple of api calls to make (sequentially, asynchronously) and some of them returns lists. My api interface is given below.
@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);
Here's what I want to do sequentially:
- Get
UserWrapperby callinggetUserSettings() - Save the user by calling
saveUser(userWrapper) - Get user's items by calling
getItems(userWrapper.getUserName()) - Get each item's information by calling
getItemInfo(item.getId()) - Save each
itemInfoby callingsaveItem(itemInfo) - Get user's friends by calling
getFriends(userWrapper.getUserName()) - Save each friend by calling
saveFriend(friend)
Now I am new to RxJava and do not know how to handle lists. I watched one of Jake Wharton's slides and found that he uses a function flattenList() but I don't know its definition. It would be great if you can help composing this chain.
Update 1
This is as far I've gotten now:
mApiService.getUserSettings()
.map(this::saveUser)
.flatMap(userWrapper -> mApiService.getItems(userWrapper.getUserName()));
.flatMapIterable( ? "How to iterate for each item" ? );
Update 2
I am trying to write something like this
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))
someMethodToIterateThroughEachItem? How does that compile?someMethodToIterateThroughEachItem,someMethodThatCanCallUserWrapperAgain, andsomeMethodToIterateThoughEachFriend