好的,我想这应该解决你的问题的第一部分:
请注意,对flatMap的第二次调用给定了2个参数 – 有一个flatMap版本,它不仅为每个输入项产生一个Observable,而且还需要一个第二个函数,这个函数又将所得到的Observable中的每个项目与相应的输入项目.
看看这个标题下的第三个图形,以获得直观的理解:
Observable obeservableOfAs = retrofitClient.getListOfAs()
.flatMap(new Func1,Observable>() {
@Override
public Observable call(List listOfAs) {
return Observable.from(listOfAs);
}
)}
.flatMap(new Func1>() {
@Override
public Observable call(A someA) {
return retrofitClient.getTheAaForMyA(someA);
}
},new Func2() {
@Override
public A call(A someA,AA theAaforMyA) {
return someA.set(theAaforMyA);
}
})
...
从这里开始,我仍然不确定你想继续下去:你准备好订阅了由此产生的可观察的?这样你可以处理每个As(onNext)或只是等到所有的完成(onCompleted).
附录:要将所有项目收集到单个列表中,那么可以将您的“可观察”< A>变成可观察的< List< A>>使用toList().
所以你有:
Observable> observableOfListOfAs = observableOfAs.toList();
如果您需要对列表的构建进行更细粒度的控制,您还可以使用reduce.
对于B,只需复制您用于As的整个流程.
然后可以使用zip等待两个流完成:
Observable.zip(
observableOfListOfAs,observableOfListOfBs,new Func2,List,MyPairOfLists>() {
@Override
public MyPairOfLists call(List as,List bs) {
return new MyPairOfLists(as,bs);
}
}
)
.subscribe(new Subscriber() {
// onError() and onCompleted() are omitted here
@Override
public void onNext(MyPairOfLists pair) {
// now both the as and the bs are ready to use:
List as = pair.getAs();
List bs = pair.getBs();
// do something here!
}
});
我想你可以猜测MyPairOfLists的定义.