RxJava выполняет операцию над списком и возвращает наблюдаемую
Я новичок в RxJava (в частности, RxJava2), и у меня возникли проблемы с тем, что кажется относительно простой операцией. Мне нужно получить некоторые данные из БД, перебрать данные (они представлены в виде списка), выполнить операцию с каждым элементом, обернуть данные в другом объекте и вернуть. Это то, что я до сих пор:
mDataManager
.getStuffList(id)
.flatMapIterable(listOfStuff -> listOfStuff)
.flatMap(item ->
mDataManager
.performCount(id, item.getTitle())
.doOnNext(item::setCounter)
.takeLast(1)
.map(counter -> item))
.toList()
.toObservable()
.flatMap(listOfStuff -> Observable.just(new StuffWrapper(listOfStuff));
У меня проблема в том, что мои вызовы менеджера данных никогда не завершаются. Идея заключалась в том, что всякий раз, когда меняются базовые данные, меняется и пользовательский интерфейс. Однако без завершения этих вызовов toList() не будет генерировать событие.
1 ответ
В RxJava 2, toList
возвращает Single
: это эквивалентно Observable
ровно с одним предметом. Вы можете преобразовать его в Observable, добавив .toObservable
, но это не нужно так часто.
Что касается других ваших изменений, что вы подразумеваете под whenever the underlying data changes
? Ваш менеджер данных уведомляет вас об изменениях данных?
Изменить: если ваш mDataManager.getStuffList(id)
вызов возвращает Observable
который выдает несколько элементов (то есть он никогда не завершает, но всегда выдает последний набор данных после изменения), тогда вам нужно сделать что-то вроде этого:
mDataManager
.getStuffList(id)
.flatMap(listOfStuff ->
Observable
.from(listOfStuff)
.flatMap(item ->
mDataManager
.performCount(id, item.getTitle())
.doOnNext(item::setCounter)
.takeLast(1)
.map(counter -> item)
.toList()
)
)
...