2017-10-06 4 views
1

イムは、それが理にかなっている場合RxJava:startWith()デフォルトのemitを追加する方法parent observableが放出するたびに?いくつかのオブジェクトを生成し、私の観察可能なパターンを、持ってしようとしている

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は重いアクションを含む、観察可能な生産を中心にemited開始、成功、エラーのようなドメインのイベントに変換されます私はこれらの状態イベントを放出したいので、UIはそれに応じて反応することができます(マップで見ることができるようにextractEpubオブジェクトを含む成功)

私の問題は、renderObservableはcombineLatestその卵子が放出されるたびに、時間内に複数の時間を放出する。

イベントの流れは、開始、成功、成功...成功です。 combineLatest whever私はそれを開始することにしたい

、成功、開始し、成功...などすなわちプリペンド開始イベントが発するが、私のRX知識が不十分です。

おかげ

答えて

1

あなたは正しい場所で観測可能なチェーンに次を挿入できます。これは、受信するすべてのイベントの前にStartedイベントを放出する

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

もちろん

イベントがStartedある場合は、Startedを発行しないように、あなたには、いくつかのロジックで追加することもでき、など

+0

どこに置いてください?どのように私はまたdoRenderObservableを実行するのだろうか? – urSus

+0

ここでは、 'startWith()' –

+0

が成功の前に来るところにあります。開始 – urSus

0

[OK]をアイブ氏はそれを把握するために管理。私が見逃していた重要な情報は、フラット・マップの右側が、左側が出るとサブスクライブされるということです。したがって、startWithはflatmap observableの右側に移動しなければならず、combinedLatestが同時に送信されたときに購読します。

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())); 
    } 
関連する問題