2016-08-18 2 views
0

좋은 체인을 만들려고합니다. 나는이 질문이 대중적이며 부탁 받았지만 그것을 발견하지 못했다고 생각한다.데이터베이스와 서버에 대한 RxJava 체인

그래서 내가 원하는 것은 데이터베이스에 들어가서 그 안에 아무것도 없으면 서버에서 정보를 다운로드하고 싶습니다.

() -> loadPriceListFromDatabase.call(null) .flatMap(mealTypes -> { if (mealTypes.size() != 0) { return Observable.just(mealTypes); //here is the place where I'm not sure about code style. } return loadPriceList.call(null) .map(model -> { preferences.setPriceListDate(model.getDate().getTime()); return ActiveAndroidHelper.saveMeals(model); }); }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()), MainActivity::onTestLoaded, BaseActivity::onError 

그래서이 어떻게해야

: 여기

코드인가? 예제를 사용해야합니까?

내가 내 \ 다른 블록의 경우 원하는 조건을 데려 가고 싶다는

UPD.

if (mealTypes.size() != 0) { 

무언가가 null이거나 0이 아닙니다. 예를 들어 나는 당신의 관찰이 자동으로 파이프 라인에 새로운 하나를 제공 할 수있는 비어있는 경우

if (date == currentDate) { (//where date is timestamp 

답변

1

을 확인보고 싶다면 : 그것은 networkObservable하지 않는 한에 가입하지 않습니다

Observable.concat(
    databaseObservable.filter(databaseItem -> databaseItem.date ==  currentDate) , 
    networkObservable 
).take(1).subscribe(...) 

databaseObservable은 onNext없이 완료됩니다.

+0

하지만 if \ else는 어디에 있습니까? 두 경우 모두 내 데이터베이스가 계속 될 것입니다. 문제는 요소가 0 인 목록을 반환 할 수 있다는 것입니다. –

+0

if/else의 필요성은 다음과 같습니다. 완료 될 때까지 데이터베이스 연결을 구독하십시오 (concat가 있기 때문에) – CristianGM

+0

데이터베이스의 전체 완료 후에 네트워크로 이동하지만 take (1)이있는 경우 데이터베이스 호출은 네트워크를 호출하기 전에 끝날 것입니다. databaseObservable이 Observable.empty()를 반환하면 networkObservable을 구독합니다. – CristianGM

0

사용 swtichIfEmpty 연산자를 말할 수있다.

확인이 예

@Test 
public void testSwitchPerson() { 
    Observable.just(new ArrayList<>()) 
       .flatMap(persons -> Observable.from(persons) 
              .switchIfEmpty(Observable.just(new Person("new", 0, "no_sex")))) 
       .subscribe(System.out::println); 

} 

좀 더 실제적인 예로서 그것은 간단합니다 여기 https://github.com/politrons/reactive