0

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

来自远程服务器的模型对象与来自房间数据库的模型对象不同。

  1. 我想将远程对象映射到本地对象
  2. 合并这两个结果
  3. 显示结果。

我的远程 API 如下所示:

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

}

我的 Room DAO 查询如下所示:

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

我已将 Observable> 转换为 Observable> ,如下所示:

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()
        }

但是当我尝试像这样压缩这两个 observable 时:

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

我得到类型推断失败,预期类型不匹配 在此处输入图像描述

4

2 回答 2

0

我犯了三个错误:

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

  2. 没有告诉如何压缩它们。

  3. Room DAO 不理解 Observable,所以使用 Flowable。

因此,为了压缩我所做的这两个 observables:

val combinedObservable = Observable
    .zip(KMagApp.database?.categories()?.categories()?.toObservable(), newSetting, 
    BiFunction<List<KmagCategory>, List<KmagCategory>, List<KmagCategory>> 
    { s1, s2 -> getCombinedList(s1, s2) })
于 2017-10-30T08:11:49.123 回答
0

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

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

于 2017-10-30T07:00:05.363 回答