Android + RxJava-загрузка данных из БД и веб-сервиса

Я хочу использовать RxJava для загрузки данных из веб-службы (через Retrofit). У меня также есть кэш базы данных предыдущих результатов.

предположим, что у меня уже есть наблюдаемые для каждого из них:

Observable<List<MyModel>> networkObservable = retrofitService.getModels();
Observable<List<MyModel>> dbObservable = database.getModels();

Я хочу объединить эти 2 наблюдаемых в:

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 сам, но я все равно хотел бы, чтобы подписчики были уведомлены, что ошибка произошло.

какие предложения?

1 ответов


использовать Observable.merge напрямую. Он объединяет несколько наблюдаемых потоков в один, поэтому, если база данных излучает быстрее, вы получите ее первым.

public static Observable<List<MyModel>> getModels() {
    return Observable.merge(dbObservable, networkObservable);
}