使用RxJava通过Realm和Retrofit获得一个独特的结果

时间:2017-08-06 17:46:38

标签: android kotlin rx-java

我知道Dan Lew几乎回答了使用

从不同来源获取数据的问题

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

但是,如果不是从本地存储的数据和改造中获取用户列表,那该怎么办呢?

我需要在显示结果之前对数据执行特定于数据库的操作,例如仅显示不同的用户。在这种情况下,只需在我的网络请求和本地数据上使用concat运算符就不会返回相同的结果。

有没有习惯用RxJava写这个的方法?

2 个答案:

答案 0 :(得分:1)

你试过distinct()吗?根据{{​​3}},此方法在发出时只会为您提供不同的对象。如果您有自定义对象,我认为您必须实施equals()hashCode()

答案 1 :(得分:0)

最终为我工作的是让网络请求返回一个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