2016-06-20 2 views
1

1)私は(メソッド観察可能> moviesWithoutGenresを持っている)の下にあるためSQLBriteの)ToListメソッドを(使用せずに2つの観測を組み合わせます指定されたフィールドのジャンルのリストを返すムービー(ムービーm)映画のリストを返しますが、映画のジャンルフィールドが</p> <p>2)私が持っているメソッド観察可能> movieGenres nullのフード

「Observable>を返すメソッドを実装する必要があります。リスト内の各ムービーにはジャンルのリストがあります。

私はこのようなストリームを実装しましたが、私の解決策はObservable.from()を使用してObservableに変換し、toList()演算子を使用してObservableに変換することです。このソリューションは、最初のメソッドのフードの下で、リアクティブSQLクエリに対してSQLBriteラッパーを使用しているため、受け入れられません。ストリームは常に開いたままであるため、SQLテーブルへの変更をすべてのサブスクライバに伝播できるため、onCompletedは呼び出されません。したがって、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が無限に観測できるためです。onComplete()が呼び出され、toList()が正常に動作するように.first()する必要があります。

+0

ありがとうございました。このソリューションは、 "Observable.from(movies)"という行に多数の映画があるにもかかわらず、1つの映画のリストを提供します。この問題の原因は何であるかわかりません。 –

+0

"switchMap()"の代わりに "concatMap()"を使用してこの問題を解決しました。あなたは答えを更新できますか? –

+1

ああ、電話してください。かわった! – Anstrong

関連する問題