Для List <A>, содержащего List <B>, как я могу изменить значения внутри B и вернуть измененный List <A>, используя RxJava2? - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь реализовать rxandroid в шаблоне MVP, Это мой случай использования:

класс A.class

   List<B> b;

   List<B> getB(){
       return b;
   }

B.class

String dataTochange;

void  setDataToChange(String dataToChange){
      this.dataToChange = dataToChange
   }

Я хочу вернуть тот же Наблюдаемый (Список (A)) после изменения значения внутри B.

Это то, что я сделал,

REMOTEDATASOURCE.java:

Observable<List<A>> getAList(){
    return FromApiService
                 .getAList()                   // returns List<A> 
                 .flatMapIterable(List<A>  ->  A )
                 .map(A::getB)
                 .flatMapIterable(List<B> b ->  b)
                 .map(b -> doSomeDownloading(b))
       //After this i want to return the modified 
     List<A> containing list of B with dataChanged.            

 }



   doSomeDownloading(B b){

   somValue = doAsynchronousDownload(b)

   b.setDataToChange(somValue);

 }


 doAsynchronousDownload(B b){

 contains callbacks to listeners implemented by View for progress etc;

 }

Структура хранилища:

enter link description here

PS: Правильна ли логика реализации, загрузка должна производиться в Presenter. или внутри хранилища!

Обновление

serviceApi.getAList()
          .flatMapIterable(List<A> -> a)
                  .flatMap(A a ->
                         Observable.fromIterable(a.getB())
                         .doOnNext(b ->doSomeDownloading(b))
                         .toList()
                         .toObservable()
                         .map(new Function<List<B>, A>() {
                             @Override
                             public A apply(List<B> b) throws Exception 
                               {
                                 a.setB(b);
                                 return a;
                             }
                         })
                  )
                .toList()
                .toObservable()
                .doOnSubscribe(...)

В приведенном выше примере результат doSomeDownloading () игнорируется ..

1 Ответ

0 голосов
/ 04 сентября 2018

Это действительно зависит от того, как вы преобразуете A в список и как вы будете с ним поступать. Если ваша трансформация проста (значит, они не занимают много времени / ресурсов). Вы можете просто использовать flatMap для «кэширования» ваших значений например:

FromApiService.getAList()
              .flatMapIterable(List<A>  ->  A)
              .flatMap{a:A -> 
                   Observable.fromIterable(a.getB())
                             .doOnNext{b -> doSomeDownloading(b)}//or Map/FlatMap if you want
                             .toList()
                             .toObservable()//here you have your new list<B>
                             .map{b -> a.setB(b)}//here you get your A
               }
...