在RxJava中从2个可观察项列表中创建一个可过滤的可观察项

时间:2018-11-18 12:35:36

标签: android rx-java observable rx-java2 rx-kotlin

我正在开发一项功能,该功能需要根据本地数据库数据过滤出网络响应数据。

例如,我的网络层返回一个项目列表,而我的数据库层返回一个可观察到的ID列表。现在,我只想从ID匹配数据库层响应中任何人的网络层返回那些对象。

下面的代码从网络中获取数据,并将结果保存到数据库(缓存)中。

factory.getRemoteDataStore()
                .searchForVenues(query)
                .toObservable()
                .distinctUntilChanged()
                .flatMap { venues ->
                    factory.getCacheDataStore()
                            .saveVenues(venues)
                            .andThen(Observable.just(venues))
                }

我还有一种方法可以返回需要过滤的场所列表

factory.getCacheDataStore().getDislikedVenues()

现在,如何扩展上一个链以使用getDislikedVenues()Observable从网络响应的响应中过滤掉它们?

很抱歉遇到这样的菜鸟问题,我真的为此感到困惑。

1 个答案:

答案 0 :(得分:0)

一种实现方法是

factory.getCacheDataStore().getDislikedVenues()
    .flatMap { dislikedItems -> 
        factory.getRemoteDataStore()
            .searchForVenues(query)
            .toObservable()
            .distinctUntilChanged()
            .flatMapIterable { it }
            .filter { !dislikedItems.contains(it.id) }
            .toList()
            .toObservable()
    }
    .flatMap { venues ->
        factory.getCacheDataStore()
            .saveVenues(venues)
            .andThen(Observable.just(venues))
    }

P.S .:据我了解,factory.getRemoteDataStore().searchForVenues(query)返回SingleMaybe。在这种情况下,distinctUntilChanged()无法工作,因为它依赖于多次发射(onNext()),但是SingleMaybe只能发射一个结果。