将rx.Observable响应过滤到两个不同的订阅者

时间:2017-04-25 12:22:15

标签: android rx-java

我正在编写Android应用程序。我在网络层使用RxJava进行Retrofit。基本上我遇到的问题是我有一个名为/feed的端点。此端点返回我在RecyclerView中显示的文章集合。其中一些文章是广告文章,一些是活动,另一些是帖子。我正在使用一个干净的架构,所以每个我想做的事情都有一个Interactor。这就是我GetFeedInteractor的样子:

@Override
public void execute(final Callback callback, int offset, int pageSize) {
    final String userSipId = mUserSipid.get();

    mFeedRepository.getFeed(offset, pageSize)
            .subscribe(new DefaultSubscriber<List<BaseFeedItem>>() {
                @Override
                public void onNext(List<BaseFeedItem> baseFeedItems) {
                    List<BaseFeedItem> cacheCollection = new ArrayList<BaseFeedItem>();

                    for (BaseFeedItem baseFeedItem : baseFeedItems) {
                        if (!(baseFeedItem instanceof AdFeedItem)) {
                            cacheCollection.add(baseFeedItem);
                        }
                    }

                    mFeedCache.saveFeeds(cacheCollection);

                    callback.onFeedsFetched(baseFeedItems);
                }
            });
}

正如您所看到的,用于显示UI中项目的Callback将使用所有三种类型的Feeds并显示它们。但是我只需要在Sqlite缓存中保存Post文章和Event文章。问题是我不喜欢在Subscriber中为instanceof做这件事。有没有更好的Rx方式呢?

更新

BTW我在几个地方使用FeedCache#saveFeed方法,但只有在这里我才能获得广告文章。因此,在FeedCache#saveFeed中进行广告过滤不是一个好的选择。

UPDATE2:

我认为完美的解决方案是,如果我可以使用一些Rx方法过滤集合,并且有一个处理原始列表的订阅者,另一个处理广告过滤列表。这样的事情。

1 个答案:

答案 0 :(得分:1)

所以,基本上你想要从一个流中获得2个流。一个是原始流(用于显示UI),另一个是过滤流(用于保存在数据库中)。不幸的是,您不能拥有多个onSubscribe,但我们可以使用Subject s的概念。

final PublishSubject<BaseFeedItem> subject = PublishSubject.create();

subject.subscribe(o -> {
    // here will be emitted all items
    // update the UI
});

mFeedRepository.getFeed(offset, pageSize)
               .map(item -> {
                    subject.onNext(item);
                    return item;
                })
               .filter(item -> !(item instanceof AdFeedItem))
               .subscribe(items -> {
                   // no `AddFeedItem`s here
                   // save into database
               });