Kotlin RxJava2合并缓存数据和主题
我有一个磁盘存储器,它从磁盘返回一个Kotlin RxJava2合并缓存数据和主题,kotlin,rx-java2,behaviorsubject,Kotlin,Rx Java2,Behaviorsubject,我有一个磁盘存储器,它从磁盘返回一个对象?(可能已保存或未保存)和一个行为主题(此数据来自其他类调用,请检查下面的代码): 代码是: private val subject: Subject<Optional<Element>> = BehaviorSubject.create() fun getElements(): Observable<List<Element>> = Observable.concat(Observable.jus
对象?
(可能已保存或未保存)和一个行为主题(此数据来自其他类调用,请检查下面的代码):
代码是:
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())
}
第一次,当存储为null时,它什么也不做,甚至我在subject.onNext(response.element.toOptional())
中有一个断点,希望onNext
将触发getElements
的流,但什么也没有发生。
第二次,当我已经将接收到的元素保存到存储器中时(因此,storage.getElement()
返回一些内容),它可以正常工作
我的功能描述是:
从缓存和主题中获取元素,首先获取到达的元素,然后返回它(第一次返回的将是主题元素),下一次,我希望第一个元素将是存储元素。您的
.filter{it.isPresent}将过滤掉空可选元素
调用,因此不会向下游发出任何消息。我假设存储是某种持久性对象,因此它存储。getElement()
可能会在创建主题时返回有效对象
如果是这种情况,那么我认为您应该在创建主题之前检查是否有存储对象,如果有,请使用BehaviorSubject.createDefalut(storedObject)
如果确实存在,或者BehaviorSubject.create()
然后在你的
getElements()
函数中,我想你可以直接使用subject.filter()
…我也这么做了,但是有同样的问题,无论如何它应该返回subject值。对不起,subject收到了一个有效值。你能澄清一下“第一次”和“下一次”是什么意思吗?你是说你有两个订户吗?(一个在调用updateSubject之前订阅,另一个在调用updateSubject之后订阅?)
getElements().subscribe(onElements(), onError());