kotlin - RxJava2 Kotlin SwitchMap 从 RealmResults 到 Observable

标签 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")
    }

错误出现在 switchmap 上。我非常熟悉 RxJS 中的运算符,但我在语法上遇到了困难。

非常感谢任何帮助。

最佳答案

您正在尝试将 Flowable switchMap 转换为 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)
    }
)

您还可以使用函数 toFlowable 将现有的 Observable 转换为 Flowable,但随后您需要指定一个 BackPressureStrategy .

示例

.switchMap{ results -> checkNewUserRequired(realm, results).toFlowable(BackpressureStrategy.DROP) }

关于kotlin - RxJava2 Kotlin SwitchMap 从 RealmResults 到 Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54243862/

相关文章:

java - rxJava2 在复杂流中组合单一的、可能的、可完成的

kotlin - 如何在kotlin中声明一个可为空的函数参数

android - 如何进行大于或小于 "Safe Casts"的比较

ios - 当我尝试在我的模型中保存数据时应用程序崩溃

android - 测试特定用例时 TestScheduler 不工作

android - 如何使用 RxJava2 取消通话?

android - kotlin 编译器返回此类警告

kotlin - RxKotlin “withLatestFrom(…)”编译错误:没有足够的信息来推断类型变量R

ios - Realm 数据库供公众使用?

swift - 替换的 List<T> 对象在 Realm 中不一致