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()
    )
)
...
Другие вопросы по тегам