由于引擎下的SQLBrite,在不使用toList()的情况下组合两个observable

时间:2016-06-20 14:25:00

标签: java android sqlite system.reactive sqlbrite

1)我有方法Observable> moviesWithoutGenres()返回电影列表但电影的类型字段为空

2)我有方法Observable> movieGenres(电影m)返回指定字段的类型列表

我需要实现应返回Observable>的方法列表中的每部电影都有流派列表。

我已经实现了这样的流,但我的解决方案是使用Observable.from()转换为Observable,而不是使用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();

1 个答案:

答案 0 :(得分: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()将正常工作