RxJava2 Kotlin SwitchMap从RealmResults到Observable

时间:2019-01-17 20:32:57

标签: kotlin realm rx-java2

好的,这是我在RxJava中遇到的第一个问题,请保持温柔。

我正在查询Realm的现有用户,将RealmResults列表作为可流动对象返回,然后我想创建一个新用户或返回现有用户,然后转换为JSON。

这是我到目前为止所拥有的。我有点卡住。

 fun getUsers(realm: Realm): Flowable<RealmResults<User>> {
     return when (realm.isAutoRefresh) {
         true -> realm.where<User>().findAllAsync().asFlowable().filter(RealmResults<User>::isLoaded)
         false -> Flowable.just(realm.where<User>().findAll())
     }
 }

fun checkNewUserRequired(realm: Realm, results: RealmResults<User>): Observable<String> {
    if (results.isEmpty()) {
       //not complete, I will create a new user here
       return Observable.just("Dummy")
    } else {
       val user = realm.where<User>().findFirst()!!
       val detachedUser = realm.copyFromRealm(user)
       return Observable.just(userToJsonString(realm, detachedUser))
    }
}

val getNewUser= getUsers(realm)
    .take(1)
    .switchMap{ results -> checkNewUserRequired(realm, results) }
    .subscribe{
        //log result
        result : String -> Log.d(TAG, "JSON OUTPUT: $result")
    }

错误在切换映射上。我对RxJS中的运算符非常熟悉,但是我在语法上苦苦挣扎。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您正在尝试将switchMap的{​​{1}}变成Flowable,这实际上是不同的类型。您需要从一种类型转换为另一种类型。

在您看来,最简单的解决方案是将Observable转换为返回checkNewUserRequired ,因为您似乎没有与反压力相关的任何问题

示例

Flowable

您还可以使用函数fun checkNewUserRequired(realm: Realm, results: RealmResults<User>): Flowable<String> = Flowable.just( if (results.isEmpty()) "Dummy" else { val user = realm.where<User>().findFirst()!! val detachedUser = realm.copyFromRealm(user) userToJsonString(realm, detachedUser) } ) 将现有的Observable转换为Flowable,但随后需要指定一个toFlowable

示例

BackpressureStrategy