2017-01-30 5 views
2

Я новичок в RxJava (в частности, RxJava2), и у меня возникают некоторые проблемы с тем, что кажется относительно простой операцией. Мне нужно получить некоторые данные из db, выполнить итерацию данных (она представлена ​​в виде списка), выполнить операцию над каждым элементом, обернуть данные в другой объект и вернуть. Это то, что у меня есть до сих пор:RxJava выполняет операцию над списком и возвращает наблюдаемый

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() не выдает событие.

ответ

0

В RxJava 2, toList возвращается Single: это эквивалентно Observable с ровно одним предметом. Вы можете преобразовать его в Observable, добавив .toObservable, но это не обязательно так часто.

Что касается других ваших изменений, что вы говорите по whenever the underlying data changes? Ваш менеджер данных уведомляет вас об изменениях данных?

Edit: если ваш 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() 
    ) 
) 
... 
+0

Да, я использую 'SqlBrite', который является оболочкой Rx вокруг вспомогательного класса Android SQLite и предоставляет уведомления о том, когда данные изменяются. Но если я правильно понял свой собственный код, toList() не позволит мне получать эти уведомления после первого? Или я чего-то не хватает? И да, я использую RxJava2 – vkislicins

+0

Ну, если вам нужно несколько раз называть 'mDataManager.getStuffList' (один раз для каждого изменения ваших данных), тогда вам нужно обернуть все вокруг. Если OTOH вызов 'getStuffList' возвращает полный набор элементов всякий раз, когда материал изменяется в базе данных, вам следует пропустить« flatMapIterable »и вложить все в эту flatMap. –

+0

Можете ли вы привести пример последнего? Я не совсем уверен, что вы имеете в виду. – vkislicins

 Смежные вопросы

  • Нет связанных вопросов^_^