【发布时间】:2022-07-28 05:16:46
【问题描述】:
我一直认为.share(replay: 1, scope: .forever) 共享一个上游订阅,无论下游有多少订阅者。
但是,我刚刚发现,如果下游订阅的计数降至零,它会停止“共享”并释放上游的订阅(因为在后台使用了 refCount())。所以当一个新的下游订阅发生时,它必须在上游重新订阅。在以下示例中:
let sut = Observable<Int>
.create { promise in
print("create")
promise.onNext(0)
return Disposables.create()
}
.share(replay: 1, scope: .forever)
sut.subscribe().dispose()
sut.subscribe().dispose()
我希望create 只打印一次,但它会打印两次。如果我删除 .dispose() 调用 - 只需一次。
如何设置上游保证最多订阅一次的链?
【问题讨论】:
-
对我来说看起来像个 bug。可以建议使用
deferred并返回just,就像在.forever范围的cmets 中一样。 -
promise.onCompleted()修复了输出。可能是连接到replay: 1:当没有输出且流未完成时,则没有什么可重播。 -
好吧,我不能在我的代码中使用
onCompleted(),因为我正在create块中开始一个数据库更改观察,这个流没有“完成” -
>没什么可重播的。