У меня есть два списка - у каждого списка есть API и для каждого элемента, который я должен назвать API (с помощью retrofit2 - android).Дождитесь завершения двух наблюдаемых окон
Могу ли я сделать что-то вроде этого?
Как я могу подписаться на их оба конца?
Observable<Integer> offerObservable = Observable.from(restDatabaseImages.getOfferImages());
Observable<Integer> otherOfferObservable = Observable.from(restDatabaseImages.getOtherOfferImages());
offerObservable.flatMap(new Func1<Integer, Observable<RestOfferImage>>() {
@Override
public Observable<RestOfferImage> call(Integer integer) {
return backendService.getDatabaseOfferImage(integer);
}
}).subscribe(new Action1<RestOfferImage>() {
@Override
public void call(RestOfferImage restOfferImage) {
offerService.saveOfferImage(restOfferImage);
}
});
otherOfferObservable.flatMap(new Func1<Integer, Observable<RestOtherOfferImage>>() {
@Override
public Observable<RestOtherOfferImage> call(Integer integer) {
return backendService.getDatabaseOtherOfferImage(integer);
}
}).subscribe(new Action1<RestOtherOfferImage>() {
@Override
public void call(RestOtherOfferImage restOtherOfferImage) {
otherOfferService.saveOtherOfferImage(restOtherOfferImage);
}
});
- UPDATE:
Я попытался переписать его, как это. Проблема заключается в том, что я вижу только первый flatMap Func1 выполнен - для первой записи ...
Observable<Integer> offerObservable = Observable.from(restDatabaseImages.getOfferImages());
Observable<Integer> otherOfferObservable = Observable.from(restDatabaseImages.getOtherOfferImages());
Observable ob1 = offerObservable.flatMap(new Func1<Integer, Observable<RestOfferImage>>() {
@Override
public Observable<RestOfferImage> call(Integer integer) {
return backendService.getDatabaseOfferImage(integer);
}
}).map(new Func1<RestOfferImage, Void>() {
@Override
public Void call(RestOfferImage restOfferImage) {
offerService.saveOfferImage(restOfferImage);
return null;
}
});
Observable ob2 = otherOfferObservable.flatMap(new Func1<Integer, Observable<RestOtherOfferImage>>() {
@Override
public Observable<RestOtherOfferImage> call(Integer integer) {
return backendService.getDatabaseOtherOfferImage(integer);
}
}).map(new Func1<RestOtherOfferImage, Void>() {
@Override
public Void call(RestOtherOfferImage restOtherOfferImage) {
otherOfferService.saveOtherOfferImage(restOtherOfferImage);
return null;
}
});
ob1.zipWith(ob2, new Func2() {
@Override
public Object call(Object o, Object o2) {
return null;
}
}).subscribe(new Subscriber() {
@Override
public void onCompleted() {
Log.d("AllDone", "DA");
onLoadingFinishedListenerCallback.onLoading2Finished();
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Object o) {
}
});
Ваша вторая версия выглядит нормально более или менее. Если вы не видите 2-ю плоскую карту, она, вероятно, означает, что наблюдаемый возвращаемый из restDatabaseImages.getOtherOfferImages() никогда не испускает элемент. Также вы можете вставить выход. – yurgis
@yurgis, извините, я имел в виду, что 2nd flatMap не вызывается, но и 1-я карта не называется. Я поставил Log.d(), поэтому я уверен. – fritz
Пожалуйста, исправьте свой вопрос. – yurgis