преобразовать Observable> в Observable>
Я пытаюсь реализовать шаблон репозитория с помощью Realm и RxJava. Интерфейс репозитория имеет такую подпись
Observable<List<T>> query(Specification specification);
Итак, когда я работаю с Realm и хотел бы получить результат "asObservable", я получаю Observable>. Я не мог найти способ преобразовать Observable> в Observable>.
может ли кто-нибудь помочь решить эту проблему?
Я пробовал sth, как это
final Observable<RealmResults<PlantRealm>> realmResults = realm.where(PlantRealm.class)
.equalTo(PlantTable.ID, "1")
.findAll().asObservable();
// convert Observable<RealmResults<PlantRealm>> into Observable<List<PlantRealm>>
return realmResults.flatMap(Observable::from).toList().map(list -> {
for (PlantRealm plantRealm : list) {
plants.add(toPlant.map(plantRealm));
}
return Observable.from(plants);
}
);
но система проверки типа все еще жалующийся....
return Observable.create( subscriber -> {
final Realm realm = Realm.getInstance(realmConfiguration);
final RealmResults<PlantRealm> realmResults = realm.where(PlantRealm.class)
.equalTo(PlantTable.ID, "1")
.findAll();
final List<Plant> plants = new ArrayList<>();
for (PlantRealm plantRealm : realmResults) {
plants.add(toPlant.map(plantRealm));
}
realm.close();
subscriber.onNext(plants);
subscriber.onCompleted();
});
3 ответов
после просмотра конференции Дэна Лью о Общие Ошибки RxJava ( ошибка выравнивания списка), я нашел ошибку, связанную с этим делом.
Итак, решение для этого случая следующее.
realmResults.flatMap(list ->
Observable.from(list)
.map(plantRealm -> toPlant.map(plantRealm))
.toList())
это видео потрясающее, я настоятельно рекомендую посмотреть его.
У меня проблема с этим решением, если я хочу получить доступ к объекту realm из другого потока. Я мог бы разобраться с другим таким же делом, но я ... все еще застрял с этим.
Я решил эту...
вы можете сделать следующее:
public Observable<List<AllTypes>> getList() {
Observable<RealmResults<AllTypes>> obs = realm.where(AllTypes.class).findAll().asObservable();
return (Observable) obs;
}
return Single.create( e -> {
ArrayList<SomeModel> arrayList = new ArrayList<>();
realm.where(SomeModel.class)
.findAllSortedAsync("createdOn", Sort.DESCENDING)
.asObservable()
.filter(RealmResults::isLoaded)
.subscribe(someModelsAsRealmResult -> {
arrayList.addAll(someModelsAsRealmResult);
e.onSuccess(arrayList);
});
});