因此,我希望能够懒惰地订阅共享数据,而不会在没有人订阅时保持共享数据。然后,如果有人再次订阅,将创建一个新的observable。我会使用一个变量,但如果没有人订阅我不希望它持续存在(因为如果我使用数组或大于int的东西我不想将它们保留在内存中)。我当前的实现工作,除了重新订阅它仍然获得最后一个值,这意味着该值仍然是持久的。我正在考虑将observable设置为nil,但我不知道该怎么做。任何人都可以帮我完成这个吗?下面的代码显示它主要起作用,但看起来数据在没有人订阅的情况下仍然存在。
var switchTwoDisposable: Disposable? = nil
@IBAction func switchOneChanged(sender: UISwitch) {
if sender.on {
self.switchOneDisposable = currentNumber().subscribeNext { (value) in
log.debug("Switch 1: \(value)")
}
} else {
switchOneDisposable?.dispose()
}
}
@IBAction func switchTwoChanged(sender: UISwitch) {
if sender.on {
self.switchTwoDisposable = currentNumber().subscribeNext { (value) in
log.debug("Switch 2: \(value)")
}
} else {
switchTwoDisposable?.dispose()
}
}
var numberObservable: Observable<Int>? = nil
func currentNumber() -> Observable<Int> {
if let number = numberObservable {
return number
}
self.numberObservable = Observable<Int>.interval(5.0, scheduler: MainScheduler.instance).shareReplay(1)
return self.numberObservable!
}
// Switch 1 turned on
// logs "Switch 1: 0"
// logs "Switch 1: 1"
// Switch 2 turned on
// immediately logs "Switch 2: 1"
// logs "Switch 1: 2"
// logs "Switch 2: 2"
// Switch 1 turned off
// logs "Switch 2: 3"
// Switch 2 turned off
// nothing happens here until we take action again
// Switch 1 turned on
// logs "Switch 1: 3"
// logs "Switch 1: 0"
答案 0 :(得分:0)
我终于找到了完全符合我需要的方便方法。可观察的shareReplayLatestWhileConnected()
会将最新值重播给第2,第3,第4等订阅者,但是当每个人都取消订阅时,则不会保留最后一个值。
从上面的示例中替换此行:
self.numberObservable = Observable<Int>.interval(5.0, scheduler: MainScheduler.instance).shareReplay(1)
......用这一行:
self.numberObservable = Observable<Int>.interval(5.0, scheduler: MainScheduler.instance).shareReplayLatestWhileConnected()
<强>更新强>
在我的情况下,我特别希望从磁盘获取值(例如Core数据或NSUserDefaults),然后如果有人更新了该值,他们可以发布我将使用rx_notification
观察到的通知。因此,为了使这个延迟加载真正起作用,我还想要一个初始值。因此,在这种情况下使用startWith
会很有帮助,其中给予startWith的值是磁盘上的当前值。所以代码类似于:
Observable<Int>.interval(5.0, scheduler: MainScheduler.instance).startWith(100).shareReplayLatestWhileConnected()