Создайте отфильтрованную наблюдаемую из 2 наблюдаемых списка элементов в RxJava - PullRequest
0 голосов
/ 18 ноября 2018

Я работаю над функцией, в которой мне нужно отфильтровать данные сетевых ответов на основе данных локальной базы данных.

Например, мои сетевые слои возвращают мне список элементов, а мой слой базы данных возвращает наблюдаемый список идентификаторов. Теперь я хочу вернуть только те объекты сетевого уровня, чей идентификатор совпадает с любым из ответа уровня базы данных.

Ниже код выбирает данные из сети и сохраняет результат в базе данных (кеше).

factory.getRemoteDataStore()
                .searchForVenues(query)
                .toObservable()
                .distinctUntilChanged()
                .flatMap { venues ->
                    factory.getCacheDataStore()
                            .saveVenues(venues)
                            .andThen(Observable.just(venues))
                }

У меня также есть метод, который возвращает список мест, которые необходимо отфильтровать

factory.getCacheDataStore().getDislikedVenues()

Теперь, как мне расширить предыдущую цепочку, чтобы использовать getDislikedVenues () Observable, чтобы отфильтровать их от ответа сетевого ответа?

Извините за такой вопрос, я действительно борюсь с этим.

1 Ответ

0 голосов
/ 18 ноября 2018

Один из способов сделать это -

factory.getCacheDataStore().getDislikedVenues()
    .flatMap { dislikedItems -> 
        factory.getRemoteDataStore()
            .searchForVenues(query)
            .toObservable()
            .distinctUntilChanged()
            .flatMapIterable { it }
            .filter { !dislikedItems.contains(it.id) }
            .toList()
            .toObservable()
    }
    .flatMap { venues ->
        factory.getCacheDataStore()
            .saveVenues(venues)
            .andThen(Observable.just(venues))
    }

PS: Как я понимаю, factory.getRemoteDataStore().searchForVenues(query) возвращает Single или Maybe.В этом случае distinctUntilChanged() не работает, потому что он основан на многократном излучении (onNext()), но Single или Maybe может излучать только один результат.

...