【问题标题】:RxJava2 merge cached data and subjectRxJava2 合并缓存数据和主题
【发布时间】:2018-03-14 12:06:44
【问题描述】:

我有一个磁盘存储,它从磁盘返回一个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());

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

我的功能描述是:

从缓存和主题中获取元素,先到达,然后返回(第一次将是谁来的主题),下一次,我希望第一个是存储的。

【问题讨论】:

  • 你能解释一下“第一次”和“下一次”是什么意思吗?你的意思是你有两个订阅者? (一个在调用 updateSubject 之前订阅,一个在之后订阅?)

标签: kotlin rx-java2 behaviorsubject


【解决方案1】:

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

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

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

【讨论】:

  • 我已经这样做了,但遇到了同样的问题,无论如何它应该返回主题值。
【解决方案2】:

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

【讨论】:

  • 抱歉,主题正在接收有效值。
猜你喜欢
  • 2017-04-10
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
相关资源
最近更新 更多