2016-06-20 16 views
1

1) У меня есть метод Наблюдаемый> moviesWithoutGenres(), который возвращает список фильмов, но поле жанры фильма является нулевойОбъединение двух наблюдаемых без использования ToList() из-за SQLBrite под капотом

2) У меня есть метод Наблюдаемый> movieGenres (Movie m), который возвращает список жанров для указанного поля

Мне нужно реализовать метод, который должен возвращать Observable>, и каждый фильм в списке будет иметь список жанров.

Я реализовал такой поток, но мое решение использует преобразование в Observable, используя Observable.from(), а не Observable>, используя оператор toList(). Это решение неприемлемо, поскольку я использую оболочку SQLBrite для реактивных запросов sql под капотом первого метода. OnCompleted не вызывается, поскольку потоки всегда остаются открытыми, так что изменения в таблицах sql могут быть распространены среди всех подписчиков. Таким образом, оператор toList не может быть выполнен.

public class Movie { 
    private String id; 
    private String title; 
    private List<String> genres; 
    ... 
} 

1) Observable<List<Movie>> moviesWithoutGenres();

2) Observable<List<String>> movieGenres(Movie m);

Должны быть реализованы:

Observable<List<Movie>> movies();

ответ

3
public Observable<List<Movie>> movies() { 
    return moviesWithoutGenres() 
    .switchMap(movies -> Observable.from(movies) // This is an Observable<Movie> 
     .concatMap(movie -> movieGenres(movie) 
     .first() 
     .map(genres -> new Movie(movie.id, movie.title, genres))) 
     .toList()); 
} 

Observable.from() будет излучать элементы в списке следуют с помощью onComplete(). Трюк с тех пор, как movieGenres бесконечно наблюдаемый, вы должны .first() его так, чтобы вызывается onComplete(), и toList() будет работать правильно

+0

Спасибо за ответ. Это решение предоставляет список с одним фильмом, несмотря на то, что на линии «Observable.from (movies)» много фильмов. Я понятия не имею, что может вызвать эту проблему. –

+0

Использование «concatMap()» вместо «switchMap()» по какой-то причине разрешило эту проблему. Не могли бы вы обновить ответ? –

+1

ах хороший звонок. Измененный! – Anstrong