无法压缩Rxjava Observables

时间:2017-10-30 06:19:00

标签: java android kotlin rx-java2 rx-kotlin2

我正在使用RxJava 2. *并且我想通过使用zip运算符合并两个observable的结果(一个来自改造,另一个来自房间)(随意建议更好)。

来自远程服务器的模型对象与来自Room Database的模型对象不同。

  1. 我想将Remote中的对象映射到本地
  2. 的对象
  3. 合并这两个结果
  4. 显示结果。
  5. 我的远程API看起来像这样:

    interface CategoryService{
    @GET("categories")
    fun getCategories(): Observable<List<Category>>
    

    }

    我的房间DAO查询如下所示:

    @Query("SELECT * FROM categories ORDER BY id")
    abstract fun categories(): Observable<List<KmagCategory>>
    

    我已经转换了Observable&gt;进入Observable&gt;像这样:

    val newCategoryList : Observable<List<KmagCategory>> =settingService.getCategories().flatMap { list ->
                Observable.fromIterable(list)
                        .map { item -> KmagCategory(item.id, item.title, item.slug, item.isFav) }
                        .toList()
                        .toObservable()
            }
    

    但是当我尝试将这两个可观察对象压缩时:

    val combinedObservable : Observable<List<KmagCategory>> = Observables.zip(KMagApp.database?.categories()?.categories()!!,newSetting)
    

    类型推断失败,预期类型不匹配 enter image description here

2 个答案:

答案 0 :(得分:0)

该错误实际上告诉您可以压缩它们,这会产生Observable<Pair<...>>。问题是您将结果分配给错误的类型。这就像说'#34;我无法添加Int s&#34;在val x: String = 1 + 2中:当然可以,但结果不是String

您需要使用zipWith并指定如何合并值。

答案 1 :(得分:0)

我犯了三个错误:

  1. 使用Observables.zip()而不是Observable.zip()

  2. 没有告诉他们如何拉链。

  3. 房间DAO不理解Observable,因此请使用Flowable。

  4. 为了拉上我做的两个可观察者:

    val combinedObservable = Observable
        .zip(KMagApp.database?.categories()?.categories()?.toObservable(), newSetting, 
        BiFunction<List<KmagCategory>, List<KmagCategory>, List<KmagCategory>> 
        { s1, s2 -> getCombinedList(s1, s2) })