2017-01-19 1 views
1

여러 관찰 데이터를 사용하여 DB를 다시로드해야하는 메소드가 있습니다. 결국 setupPlace (selecetedPlace) 메소드를 호출해야하지만 한 번만 호출해야합니다. 각 관측 가능 객체는 서로 다른 객체 (void, object, listOfObjects)를 반환합니다.RxJava는 모든 관찰이 완료된 후에 sth를 수행합니다.

private void reloadDatabaseFromRest(final Place selectedPlace, final Event selectedEvent) throws ParseException { 
    Observable.concat(DatabaseManager.getInstance().clearDatabase(), 
      mPlaceUseCase.getPlacesListFromRestObservable() 
        .filter(places -> places != null && !places.isEmpty()) 
        .doOnNext(places -> mPlaceUseCase.savePlacesToRepository(places)), 
      mPlaceUseCase.saveSelectedPlace(selectedPlace), 
      mEventUseCase.getEvenListObservableFromRest(selectedPlace.getId()) 
        .doOnNext(eventList -> mEventUseCase.saveEventsToRepository(eventList)), 
      mEventUseCase.saveSelectedEventObservable(selectedEvent)) 
      .takeLast(1) 
      .subscribe(o -> mSplashScreenUI.setupPlace(selectedPlace)); 
} 

그러나이 방법은 마지막 관찰 할 때만 subsribe()를 수행하고 다른 것은 호출하지 않습니다 (맞습니까?). 필터를 사용하여, zip 및 어리석은 경우 (instanceOf ArrayList) 절을 만들려고했지만 잘못된 방법입니다. 누군가 나를 도울 수 있습니까?

+1

'concat' 순서대로 모든 관찰 가능한를 호출 할 필요가 대신 CONCAT를 사용 는() 나는 flatMap()을 사용했다. –

답변

4

Completable 유형을 사용할 수 있습니다. Completable은 구독자에게 스트림이 끝났음을 알립니다.

관찰 할 수있는 모든 관측 자료를 완료 테이블 Completable.fromObservable()으로 병합 한 다음 Completable.merge()으로 병합 (병행 시작)하거나 Completable.concat과 연속하여 연결하십시오.

참고 : 당신이 Completable로 바꿈 관찰 가능한 모든 onComplete를 호출합니다 그래서 끝없는 스트림이 아니라는 것을 확인하십시오.

0

대단히 감사합니다 @ koperko! 그것은 매력처럼 작동하고 이것이 정확하게 필요한 것입니다. 다시 작성하는 동안 처음 Observable에서 6 개 항목 (clearDatabase())을 방출하므로 Completable로 감싸서 작동합니다!

private void reloadDatabaseFromRest(final Place selectedPlace, final Event selectedEvent) { 
    Completable.fromObservable(
      DatabaseManager.getInstance().clearDatabase() 
        .flatMap(aVoidDB -> mPlaceUseCase.getPlacesListFromRestObservable().filter(places -> places != null && !places.isEmpty())) 
        .flatMap(places -> mPlaceUseCase.savePlacesToRepository(places)) 
        .flatMap(aVoidPlace -> mPlaceUseCase.saveSelectedPlace(selectedPlace)) 
        .flatMap(aVoidSelectedPlace -> { 
         try { 
          return mEventUseCase.getEvenListObservableFromRest(selectedPlace.getId()); 
         } catch (ParseException e) { 
          Log.e(TAG, e.getMessage()); 
          return null; 
         } 
        }) 
        .filter(eventList -> eventList != null) 
        .flatMap(eventList -> mEventUseCase.saveEventsToRepository(eventList)) 
        .flatMap(aVoidEvents -> mEventUseCase.saveSelectedEventObservable(selectedEvent))) 
      .subscribe(() -> { 
       mSplashScreenUI.setupPlace(selectedPlace); 
      }); 
} 
관련 문제