2016-11-22 3 views
0

Как сшить два наблюдаемых в RxJava?RxJava пошив двух запросов

Observable<List<CalendarEvent>>, для каждого CalendarEvent, я хочу выполнить операцию в сети, чтобы прочитать имя (lat, lon) и выбор места, а затем объединить имя места в CalendarEvent.

public Observable<List<CalendarEvent>> getEvents() { 
    // get events 
    // translate each Event LatLng to Place and bind it to Event 
    // return the events 
} 

ответ

0

Нет необходимости что-то фантазии здесь, это было бы грубо делать то, что вы хотите, я думаю:

public class Foobar { 

    void doSomethingWithEvents() { 

     getEvents().subscribe(new Action1<List<CalendarEvent>>() { 
      @Override 
      public void call(List<CalendarEvent> calendarEvents) { 

       for (CalendarEvent event : calendarEvents) { 

        getPlaceForEvent(event).subscribe(new Action1<Place>() { 
         @Override 
         public void call(Place place) { 

          event.setPlace(place); 

         } 
        }); 

       } 

      } 
     }); 
    } 

    Observable<Place> getPlaceForEvent(CalendarEvent event) { 
     return Observable.just(new Place()); 
    } 


    Observable<List<CalendarEvent>> getEvents() { 

     return Observable.just(new ArrayList<CalendarEvent>()); 

    } 


} 
+0

спасибо за красивый, но, пустота doSomethingWithEvents() должен возвращать ** Observable <Список > **, поскольку я потребляю это в презентаторе (MVP). – purplebee

1
public Observable<List<CalendarEvent>> getEvents() { 
    List<CalendarEvent> sourceList = ... 
    return Observable.from(sourceList) //emits each item separately 
      .concatMap(calendarEvent -> applyPlaceName(calendarEvent)) //fetches places and applies them for each item 
      //fyi: concatMap executes requests sequentially, if you want do it in parallel - use flatMap instead 
      .toList(); //collects items to list 
} 

//somewhere in your Networking class 
public Observable<CalendarEvent> applyPlaceName(CalendarEvent calendarEvent) { 
    return Observable ... //do network call and apply placeName on item 
} 

//p.s. don't forget to apply appropriate Schedulers 
Смежные вопросы