RxJava を使用して、(レトロフィット経由で) Web サービスからデータをロードしたいと考えています。以前の結果のデータベース キャッシュもあります。
これらのそれぞれについて、すでにオブザーバブルがあると仮定します。
Observable<List<MyModel>> networkObservable = retrofitService.getModels();
Observable<List<MyModel>> dbObservable = database.getModels();
これら2つのオブザーバブルを1つにマージしたい:
public class MyModelHelper {
public static Observable<List<MyModel>> getModels() {
// TODO: Help!
}
}
私が望む動作は、サブスクライバーがデータベースの結果を利用可能になるとすぐに受け取り、続いて restService の結果を受信することです (データベースからのフェッチがネットワーク呼び出しを行うよりも速いと仮定します)
私が自分で思いつくことができる最高のものは次のとおりです。
public class MyModelHelper {
public static Observable<List<MyModel>> getModels() {
List<MyModel> emptyList = new LinkedList<>();
// 'startWith' because combineLatest wont call back until all source observables emit something
Observable.combineLatest(dbObservable.startWith(emptyList),
networkObservable.startWith(emptyList),
new Func2<List<MyModel>, List<MyModel>, List<MyModel>>() {
@Override
public List<MyModel> call(List<MyModel> first, List<MyModel> second) {
return merge(first, second);
}
});
}
}
これは私には少しハッキリしているように思えます。このような一般的なシナリオには、より良い解決策が必要だと思います。
また、ネットワーク オブザーバブルでエラーが発生した場合でも、db の結果が引き続き渡されると便利です。onErrorResumeNext()
dbObservable 自体を呼び出して返すこともできますが、エラーが発生したことをサブスクライバーに通知する必要があります。
助言がありますか?