清理可观察对象
Cleaning up observables
我正在使用 rxSwift,我有一本可以订阅的可观察对象字典。
var observables: [String: Observable<Bool>] = [:]
有时我必须清理其中的一些可观察对象。我是这样做的
observables.removeValue(forKey: someKey)
是否足以用上面的行清理 observables? observable 是否也被杀死了(或者我如何 "kill" 它)?有人可能已经订阅了 observable,然后即使将它从字典中删除后它仍然存在并且可能会触发,对吧?
还是因为没有人对它有很强的引用,所以在我删除它的那一刻 Observable 就消失了?在将可观察对象移除给潜在订阅者的那一刻会发生什么?
我无法访问 class 的订阅者,其中保存了包含可观察对象的字典。
您可以使用 takeUntil
运算符。它将向可观察对象发送完成信号,因此订阅者将释放保留的资源。
例如,您可以设置 PublishSubject
发送可观察标识符以完成该可观察。
var observables: [String: Observable<Bool>] = [:]
let finishObservable = PublishSubject<String>()
func addObservable(observable: Observable<Bool>, withId identifier: String) -> Observable<Bool> {
let condition = finishObservable.filter { [=10=] == identifier }
let newObservable = observable.takeUntil(condition)
observables[identifier] = newObservable
return newObservable
}
这样,要清理 一个可观察对象,您可以发送可观察对象标识符,然后您可以从字典中删除完整的序列。
func removeObservable(identifier: String) {
// Complete the observable so it stops sending events and subscriber releases resources
finishObservable.onNext(identifier)
observables.removeValue(forKey: identifier)
}
如果您打算在观察者之间共享订阅,您也可以使用 ConnectableObservable
。当订阅者来来去去但你想共享相同的订阅时,我使用过这种可观察对象。例如,如果 observable 获取网络资源,这将很有用。
var disposables: [String: Disposable] = [:]
func addObservable(observable: Observable<Bool>, withId identifier: String) -> Observable<Bool> {
let newObservable: ConnectableObservable = observable.replay(1)
disposables[identifier] = newObservable.connect() // This call triggers the subscription, so you can call it later
return newObservable
}
func removeObservable(identifier: String) {
if let disposable = disposables.removeValue(forKey: identifier) {
disposable.dispose()
}
}
我正在使用 rxSwift,我有一本可以订阅的可观察对象字典。
var observables: [String: Observable<Bool>] = [:]
有时我必须清理其中的一些可观察对象。我是这样做的
observables.removeValue(forKey: someKey)
是否足以用上面的行清理 observables? observable 是否也被杀死了(或者我如何 "kill" 它)?有人可能已经订阅了 observable,然后即使将它从字典中删除后它仍然存在并且可能会触发,对吧? 还是因为没有人对它有很强的引用,所以在我删除它的那一刻 Observable 就消失了?在将可观察对象移除给潜在订阅者的那一刻会发生什么?
我无法访问 class 的订阅者,其中保存了包含可观察对象的字典。
您可以使用 takeUntil
运算符。它将向可观察对象发送完成信号,因此订阅者将释放保留的资源。
例如,您可以设置 PublishSubject
发送可观察标识符以完成该可观察。
var observables: [String: Observable<Bool>] = [:]
let finishObservable = PublishSubject<String>()
func addObservable(observable: Observable<Bool>, withId identifier: String) -> Observable<Bool> {
let condition = finishObservable.filter { [=10=] == identifier }
let newObservable = observable.takeUntil(condition)
observables[identifier] = newObservable
return newObservable
}
这样,要清理 一个可观察对象,您可以发送可观察对象标识符,然后您可以从字典中删除完整的序列。
func removeObservable(identifier: String) {
// Complete the observable so it stops sending events and subscriber releases resources
finishObservable.onNext(identifier)
observables.removeValue(forKey: identifier)
}
如果您打算在观察者之间共享订阅,您也可以使用 ConnectableObservable
。当订阅者来来去去但你想共享相同的订阅时,我使用过这种可观察对象。例如,如果 observable 获取网络资源,这将很有用。
var disposables: [String: Disposable] = [:]
func addObservable(observable: Observable<Bool>, withId identifier: String) -> Observable<Bool> {
let newObservable: ConnectableObservable = observable.replay(1)
disposables[identifier] = newObservable.connect() // This call triggers the subscription, so you can call it later
return newObservable
}
func removeObservable(identifier: String) {
if let disposable = disposables.removeValue(forKey: identifier) {
disposable.dispose()
}
}