7

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 自体を呼び出して返すこともできますが、エラーが発生したことをサブスクライバーに通知する必要があります。

助言がありますか?

4

1 に答える 1