Не удается заархивировать наблюдаемые объекты Rxjava

Я использую 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()
        }

Но когда я пытаюсь заархивировать эти две наблюдаемые, вот так:

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

Я получаю сообщение Ошибка ввода типа, ожидаемое несоответствие типа  введите описание изображения здесь


person erluxman    schedule 30.10.2017    source источник


Ответы (2)


На самом деле ошибка говорит вам, что вы можете заархивировать их, и это приведет к Observable<Pair<...>>. Проблема в том, что вы присваиваете результат неправильному типу. Это все равно, что сказать «Я не могу добавить Ints» в val x: String = 1 + 2: конечно, можно, но результат не будет String.

Вам нужно использовать zipWith и указать как объединить значения.

person Alexey Romanov    schedule 30.10.2017

Я совершил три ошибки:

  1. Использовал Observables.zip () вместо Observable.zip ()

  2. Не сказал, как их застегнуть.

  3. Room 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) })
person erluxman    schedule 30.10.2017