问题描述
背景: 我有一个观察到的返回模拟项目和实际项目。模拟项目用于ui中,而实际项目仍在进行中。模拟项应始终首先到达,以防止意外覆盖ui中的实际项。前提是ui层是愚蠢的,它既不知道它正在显示哪些项目,也不知道以任何方式对其进行管理。因此,可观察到的唯一物品来源。简化后看起来像这样。
val one = Observable.fromCallable { "Mock/cached items" }
val two = Observable.fromCallable { "Live items" }
val result = Observable.concat(listof(one,two))
.subscribe {
println(it)
}
现在,我想重播此可观察值,因为在更下游,它只是通过combineLatest()运算符组合在一起的许多可观察值中的一个,因此我无法单独对其进行订阅。因此,我在concat()之后添加了replayWhen(...),一切正常。
问题: 当我在某些情况下只需要重播模拟项目而不是在其他情况下重播所有项目时,事情变得棘手。尝试失败:
val subject1 = PublishSubject.create<Unit>()
val subject2 = PublishSubject.create<Unit>()
val one = Observable.fromCallable { "Mock/cached items" }.repeatWhen { subject1 }
val two = Observable.fromCallable { "Live items" }.repeatWhen { subject2 }
val result = Observable.concat(listof(one,two))
.subscribe {
println(it)
}
subject1.onNext(Unit)
subject2.onNext(Unit)
很明显,它只打印模拟项,而没有调用实时项(不久以后:-)。这是因为concat从第一个可观察的开始等待onComplete,因为重播运算符不会发生这种情况。
解决方案及其缺点:
- 用合并替换 concat 。这样,两个可观察的对象都可以工作,但是不能保证可观察的一个会在可观察的两个之前触发。有没有办法在没有concat的情况下实现可观察对象之间的排序?
- 在concat之后具有replayWhen(),可整体重播此结果,但可观察到的 two 的.fromCallable {}中包含一些内容,以知道何时跳过它。不知道会是什么,因为一个简单的标志将不可靠并且依赖于可能偶尔更改的外部状态。
感谢您提出其他任何想法。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)