Использование RxJava для получения отличного результата с помощью Realm и Retrofit

Я знаю, что Дэн Лью в значительной степени ответил на вопрос о получении данных из разных источников с помощью

.concat(/*...*/) .take(1)

Но что, если вместо получения списка пользователей из моих локально хранимых данных и их модификации.

Мне нужно было выполнить операцию с базой данных для данных, прежде чем отображать результат, например, показывая только отдельных пользователей. В этом случае просто использование оператора concat как для моего сетевого запроса, так и для локальных данных не вернет тот же результат.

Есть ли какой-нибудь идиоматический способ написания этого с помощью RxJava?

Вы пробовали distinct() ? Согласно документации , этот метод даст вам только другой объект, когда он испускается. Если у вас есть пользовательские объекты, я думаю, вы должны реализовать equals() и hashCode()

То, что в конечном итоге отлично работает для меня, – это запрос сети вернуть RealmResult и сохранить данные непосредственно перед вызовом RealmQuery – так что-то вроде:

 fun network(): Observable<RealmResult<Something>> { return getAuth() .andThen(somethingRepository.getRemoteSomething()) .doOnNext { somethings: List<Something> -> somethingRepository.saveSomethings(somethings) } .flatMap { distinctSomethings } } val distinctSomethings: Observable<RealmResults<Something>> by lazy { getDistinctSomethings() } //... later fun showDistinctSomethings() { Observable.concat( distinctSomethings, network() ) .filter { somethings: RealmResults<Something> -> somethings.toArray().isNotEmpty() } .take(1) .subscribe(/*..show distinct somethings here.*/) } 

Тем не менее, вы можете заменить getDistinctSomethings() на любой сложный вид Realm, и вы всегда получите правильный результат

Надеюсь, это поможет кому-то рядом со мной: P