我正在使用RxJava 2. *并且我想通过使用zip运算符合并两个observable的结果(一个来自改造,另一个来自房间)(随意建议更好)。
来自远程服务器的模型对象与来自Room Database的模型对象不同。
我的远程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)
答案 0 :(得分:0)
该错误实际上告诉您可以压缩它们,这会产生Observable<Pair<...>>
。问题是您将结果分配给错误的类型。这就像说'#34;我无法添加Int
s&#34;在val x: String = 1 + 2
中:当然可以,但结果不是String
。
您需要使用zipWith
并指定如何合并值。
答案 1 :(得分:0)
我犯了三个错误:
使用Observables.zip()而不是Observable.zip()
没有告诉他们如何拉链。
房间DAO不理解Observable,因此请使用Flowable。
为了拉上我做的两个可观察者:
val combinedObservable = Observable
.zip(KMagApp.database?.categories()?.categories()?.toObservable(), newSetting,
BiFunction<List<KmagCategory>, List<KmagCategory>, List<KmagCategory>>
{ s1, s2 -> getCombinedList(s1, s2) })