我有一个从磁盘返回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()
返回一些东西)时,它可以正常工作。
我的功能描述是:
从缓存和主题中获取元素,首先获取元素并返回它(第一次它将成为主题者),下次,我希望第一个将是存储元素。
答案 0 :(得分:0)
我假设存储是某种持久性对象,所以storage.getElement()
可能会在您创建主题时返回有效对象?
如果是这种情况,那么我认为您应该在创建主题之前检查是否有存储的对象,如果是,请使用BehaviorSubject.createDefalut(storedObject)
(如果存在)或BehaviorSubject.create()
(如果不存在)。
然后在getElements()
函数中,我认为您可以使用subject.filter()
....
答案 1 :(得分:-1)
您的.filter { it.isPresent }
调用正在过滤掉您的空可选元素,因此不会向下游发送任何内容。