を組み合わせる:のRx +レトロフィット+ルーム - 私は次のような問題を持っているシングルおよびフロアブル
私はレトロフィットを使用してシングル<>要求を取得し、フロアブル<>(ルーム)とそれを組み合わせる必要があります。両方が完了すると、UIにデータが表示されます。そして私はルームから継続的なアップデートを受けたいと思っています。
これは一般的な方法であるため、zip演算子を使用しようとしましたが、zipの問題は両方のソースからのデータを待つことです。つまり、 Retrofitから新鮮なデータも必要とするため、新しいエミッションを伝播します。
私の現在のソリューションは、combineLatestを使用して、このいずれかになります。
Flowable<UiModel> getData() {
return Flowable.combineLatest(networkService.getUsers().toFlowable(),
roomDao.getBooks(), UiModel::success)
.onErrorReturn(UiModel::error)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.startWith(UiModel.loading());
}
これは動作しますが、マイナーな問題のカップルがあります。最初に、UiModelの複数の排出物があります。これはcombineLatestで期待されています。データベースからのデータを含む最初のモデルを取得し、ネットワーク要求が完了すると2番目のモデルを取得します。私はskip(1)演算子を使用して最初の発光をスキップすることができますが、ネットワークサービスをローカルキャッシュに置き換えようとしましたが、両方のデータソースが同じ(似たような)時間に終了すると、combineLatestは単一のUiModelを放出します。
私が欲しいものを達成するためのより良い方法はありますか?
EDIT:onErrorReturnの前に.distinctUntilChanged演算子を追加しました。それは実際にはどんな問題も解決するはずです。
あなたは継続的な排出を望みますが、 'UiModel :: success'を呼びたくないのですか? –