清理可观察对象

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()
    }
}