我正在使用rxSwift,我有一个可以订阅的可观察词典。
var observables: [String: Observable<Bool>] = [:]
在某些时候,我必须清理其中一些可观察物。我这样做如下
observables.removeValue(forKey: someKey)
用上述线清理可观测量是否足够?观察者是否也被杀死(或者我如何杀死&#34;它)?有人可能已经订阅了observable,然后甚至在从字典中删除它之后它仍然存活并且可能会触发,对吧? 或者当我删除它时,观察结果是否已经消失,因为没有人强烈提及它?当观察者被移除给潜在的受害者时会发生什么?
我无法访问保留带有observables的字典的类的订阅者。
答案 0 :(得分:1)
您可以使用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 { $0 == identifier }
let newObservable = observable.takeUntil(condition)
observables[identifier] = newObservable
return newObservable
}
这样,要 clean 一个observable,你可以发送可观察的标识符,然后你可以从字典中删除已完成的序列。
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()
}
}