RxJava2合并缓存的数据和主题

时间:2018-03-14 12:06:45

标签: kotlin rx-java2 behaviorsubject

我有一个从磁盘返回Object?的磁盘存储(可能已保存或未保存)和一个BehaviourSubject(此数据来自其他类调用,请在下面检查代码):

代码是:

private val subject: Subject<Optional<Element>> = BehaviorSubject.create()

fun getElements(): Observable<List<Element>> =
    Observable.concat(Observable.just(storage.getElement()), subject)
        .filter({ it.isPresent })
        .take(1)
        .flatMapSingle { 
            Observable.just(it.get())
                .flatMapIterable { it.categories }
                .toList()
        }

fun updateSubject(response: Response) {
    storage.save(response.element) //Save element in storage
    subject.onNext(response.element.toOptional())
}

我的问题是,在我做的其他课程中

getElements().subscribe(onElements(), onError());

第一次,当存储空为null时,它什么也没做,即使我在subject.onNext(response.element.toOptional())中有一个断点,希望onNext将触发getElements的流,但没有任何反应。 第二次,当我已经在存储中保存了收到的元素(所以storage.getElement()返回一些东西)时,它可以正常工作。

我的功能描述是:

从缓存和主题中获取元素,首先获取元素并返回它(第一次它将成为主题者),下次,我希望第一个将是存储元素。

2 个答案:

答案 0 :(得分:0)

我假设存储是某种持久性对象,所以storage.getElement()可能会在您创建主题时返回有效对象?

如果是这种情况,那么我认为您应该在创建主题之前检查是否有存储的对象,如果是,请使用BehaviorSubject.createDefalut(storedObject)(如果存在)或BehaviorSubject.create()(如果不存在)。

然后在getElements()函数中,我认为您可以使用subject.filter() ....

答案 1 :(得分:-1)

您的.filter { it.isPresent }调用正在过滤掉您的空可选元素,因此不会向下游发送任何内容。