2017-10-06 8 views
1

메신저, 같은 도메인 이벤트로 변환됩니다 시작, 성공, 관찰을 일으키기 주위 emited 오류, 즉 의미RxJava : startWith() 기본 앞에 붙이는 방법 부모가 관찰 할 수있는 시간마다 emit을 내 보냅니다. 나의 관찰은 어떤 객체를 생성하는 패턴을 가지고 노력

public Observable<BookRenderingEvent> extractAndRenderObservable(String epubPath) { 
     return extractObservable(epubPath) 
       .flatMapObservable(extractedEpub -> renderObservable(extractedEpub) 
         .<BookRenderingEvent>map(renderedEpub -> new BookRenderingEvent.Success(renderedEpub)) 
         .onErrorReturn(t -> new BookRenderingEvent.Error()) 
         .startWith(new BookRenderingEvent.Started())); 
    } 

private Observable<RenderedEpub> renderObservable(ExtractedEpub extractedEpub) { 
     return Observable.combineLatest(readerConfigObservable(), pagerDimensionsObservable(), ..) 
        .switchMapSingle(foo -> doRenderObservable()) <--- heavy work 
        .map(bar -> new RenderedEpub(bar)) 
} 

renderObservable 무거운 조치를 포함하게하는 경우 그래서 나는이 상태 이벤트를 내고 싶다. 그래서 UI는 그에 따라 반응 할 수있다. (지도에서 볼 수있는 것처럼 추출 된 Epub 객체를 포함하는 성공과 함께)

내 문제는 renderObservable에 combineLatest "그것의 obervables가 방출 할 때마다, 시간에서 다수 시간을 내 놓는다.

따라서 이벤트 흐름은 Started, Success, Succes ... Success입니다.

나는 등 combineLatest whever 즉 앞에 추가 시작 이벤트가 방출 .. 시작, 성공, 성공 시작,하지만 내 RX 지식이 불충분 할 싶어요.

감사

답변

1

당신은 바로 이곳에서 관찰 체인에 다음을 삽입 할 수는 :

.flatMap(event -> Observable.just(new BookRenderingEvent.Started(), event) 

이것은 수신하는 모든 이벤트 전에 Started 이벤트를 방출합니다. 이벤트가 Started 인 경우 등

+0

당신이 그것을 어디에하시기 바랍니다 둘 것 방출하는 경우에 가입 가도록, 관찰 flatmap의 오른쪽으로 이동했다? 아이디어에서 벗어나서 .. 결합 이후에 갈 필요성을 짐작해라. 가장 최근의 모든 방출에 방아쇠를 당긴다. 그런데 doRenderObservable도 어떻게 달릴까? – urSus

+0

바로 현재'startWith()'가 –

+0

이고 성공하기 전에 성공한 경우는 – urSus

0

, Started를 발행하지 않는 확인 필자는 그것을 알아 내기 위해 관리 있도록 물론

, 당신은 몇 가지 논리에 추가 할 수 있습니다. 필자가 놓친 중요한 정보는 좌측면이 방출 될 때 flatmap의 우측면이 구독된다는 것이다. 따라서 startWith 적 combineLatest가

public Observable<BookRenderingEvent> extractAndRenderObservable(String epubPath) { 
     return extractObservable(epubPath) 
       .flatMap(extractedEpub -> Observable.combineLatest(readerConfigObservable(), pagerDimensionsObservable(), ..) 
         .switchMap(foo -> renderObservable(extractedEpub) 
          .<BookRenderingEvent>map(renderedEpub -> new BookRenderingEvent.Success(renderedEpub)) 
          .onErrorReturn(t -> new BookRenderingEvent.Error()) 
          .startWith(new BookRenderingEvent.Started())); 
    }