我有一个长时间运行的操作,它返回一个我无法控制的代码中的值。我需要将这个价值发布到要求它的东西上。为此,我使用BehaviorSubject
:
var subject: Subject<Value>? = null
fun retrieveValue(): Single<Value> {
if (subject == null) {
subject = BehaviorSubject.create<Value>()
someOtherThing.retrieveValueAsync { value ->
subject.onNext(value)
}
}
return subject.singleOrError()
}
这让我只执行一次操作,并将结果作为单个结果发送给所有未来感兴趣的各方。但是,它不起作用。在我打电话之前,单曲不会发出值:
subject.onComplete()
但这是一个问题,因为一旦主题完成,未来的事情就再也无法订阅了。
从另一个observable缓存值并将其传递给Single的适当方法是什么?如果有一个方法让一个主题自动完成,一旦其源可观察性发出一个可行的值。 Single.cache()
也看起来很有希望,但我不确定如何处理这样一个事实:在这种情况下,我的价值是异步的。
感觉我错过了一些愚蠢的事情。
答案 0 :(得分:0)
这种情况有SingleSubject
。
如果您不想在代码库中使用实验代码,可以使用ReplaySubject.createWithSize(1)
并调用onComplete
而不会丢失最后一个值,然后将其转换为Single
。