2016-09-16 2 views
2

RxJava/Android에서 전체 응용 프로그램을 개발하여 가능한 가장 Rx 방식으로 만들려고합니다.특정 조건에서만 관찰 가능 객체를 연결하는 데 사용할 RxJava 연산자

나는 내가 원하는 것을 이루고 있다고 생각하지만, 지금은 더 나은 방법이 있다고 확신하는 문제가 발생했습니다. 그것은 구성

  1. 는 관찰 가능한
  2. A로부터 부울 받기 : 그것이 사실이라면, 당신이 완료, true를 돌려줍니다. B : 거짓이면 요청 (firstRequest라고 함)하고 Observable을 수신합니다.
  3. A : 사실이라면, 당신은 끝났습니다. B : 거짓이면 다른 요청을하십시오 (secondRequest).
  4. A : true를 반환하면 다시 완료됩니다. false 인 경우 processFailed()를 실행하십시오.

은 지금은 매우 순진한 방법으로 그것을 구현 (그리고 차선)했습니다

public void startProcess(){ 
    dataRepository.getStatus() 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(status -> { 
     if(status){ 
     processCompleted(); 
     } else { 
     makeFirstRequest(); 
     } 
    }); 
} 

private void makeFirstRequest(){ 
    dataRepository.firstRequest() 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(status -> { 
     if(status){ 
     processCompleted(); 
     } else { 
     makeSecondRequest(); 
     } 
    }); 
} 

private void makeSecondRequest(){ 
    dataRepository.firstRequest() 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(status -> { 
     if(status){ 
     processCompleted(); 
     } else { 
     processFailed(); 
     } 
    }); 
} 
내가 (더 이해하게하는 방식으로 그 작업을 결합하는 방법을 알고 싶습니다

나는 combine을 엿보았지만, 이것에 대한 의도 된 유스 케이스는 아니라고 생각합니다.) 그리고 3 번 가입하는 것은 옳지 않다고 생각합니다.

flatmapping (Observable을 반환하는 것이 좋습니다)에 대해 생각했지만 중첩 된 작업 체인 (flatMap 내의 flatMap 내의 flatMap)은 일부 연산자에서 동일한 결과를 얻는 간단한 방법이 있어야한다고 생각하게했습니다 .

미리 감사드립니다. 구조에

답변

7

flatMap :

dataRepository.getStatus() 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .flatMap(status -> status ? Observable.empty() : dataRepository.firstRequest()) 
    .flatMap(status -> status ? Observable.empty() : dataRepository.secondRequest()) 
    .defaultIfEmpty(false) 
    .subscribe(status -> { 
    if(status){ 
     processCompleted(); 
    } else { 
     processFailed(); 
    } 
    }); 

또한 Observable.just(status)Observable.empty을 대체 할 수 있습니다.

+0

와우, defaultIfEmpty에 대해 알지 못했지만 실제로는 매우 명확하게 연결됩니다. 고마워요! – dexafree

관련 문제