2016-11-26 5 views
2

私はRxJava2を通して自分のやり方と戦っています。私の解決策が受け入れ可能かどうか、それを改善する方法があるのだろうかと思います。 RxJava2:パラレルデータのダウンロードとキャッシングを改善するには?

  • いくつかのバックエンド呼び出しはできるだけ早くこれらの仕上げのいずれかのよう
  • 並列に処理されるまで待機してください - - データ

    ユースケース

    1. ユーザーはダイアログが表示され、更新データボタン
    2. を押しますローカルデータベースに保存されます
    3. すべての要求が完了した(バックエンド呼び出しと永続化)後、ダイアログは閉じる必要があります

    現在のソリューション

    私はCompletablesいくつかのこのように見ています

    Completable organisationUnitCompletable = backendService.getOrganisationUnits() 
        .doOnNext(data -> organisationUnitDao.saveInTx(data)) 
        .ignoreElements() 
        .subscribeOn(Schedulers.io()); 
    
    Completable locationCompletable = backendService.getLocations() 
        .doOnNext(data -> locationDao.saveInTx(data)) 
        .ignoreElements() 
        .subscribeOn(Schedulers.io()); 
    
    Completable prioritiesCompletable = backendService.getPriorities() 
        .doOnNext(data -> priorityDao.saveInTx(data)) 
        .ignoreElements() 
        .subscribeOn(Schedulers.io()); 
    

    私はリストに追加し、merge演算子を使用することで、1つにパック:

    List<Completable> compatibles = new ArrayList<>(); 
    compatibles.add(organisationUnitCompletable); 
    compatibles.add(locationCompletable); 
    compatibles.add(prioritiesCompletable); 
    
    Completable.merge(compatibles) 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(() -> { 
        progressDialog.dismiss(); 
    }); 
    

    改善の可能性nts

    これは意図した通りです。しかし、私はそれほど幸せではないことがあります。

    本当に各完成品にsubscribeOn(Schedulers.io())を追加する必要がありますか?それはそれなしでは並行して動作しませんが、おそらくこれを行う良い方法がありますか?

    これらの行はすべて一致しています。

    .ignoreElements() 
        .subscribeOn(Schedulers.io()); 
    

    1つの方法に抽出する方法はありますか?私はこのようなものを試しました。

    private <T> Completable prepareCompletable(Function<Void, Observable<List<T>>> source, AbstractDao<T, Long> dao) { 
    
        Completable orderTypeCompletable = source 
          .doOnNext(data -> dao.saveInTx(data)) 
          .ignoreElements() 
          .subscribeOn(Schedulers.io()); 
    } 
    

    私はObservableとDAOを入れています。もちろん、それはコンパイルされません。ジェネリックについては、すでに持っているよりもはるかに多くの知識を必要とするようです。

    申し訳ありませんが長い質問のために、ごくわずかな言葉でユースケース全体を説明するのは難しいです。

  • +0

    すてきで透明な質問です。ありがとう。 – okarakose

    答えて

    2

    各CompletableにsubscribeOn(Schedulers.io())を追加する必要がありますか?

    はい、ただし、Completable.merge()以降は必要ありません。

    1つの方法に抽出する方法はありますか?

    public static <T> Function<Flowable<T>, Completable> applyIgnore() { 
        return f -> f.ignoreElements().subscribeOn(Schedulers.io()); 
    } 
    
    Completable locationCompletable = backendService.getLocations() 
    .doOnNext(data -> locationDao.saveInTx(data)) 
    .to(applyIgnore());