清理可观察物

时间:2017-05-10 08:01:33

标签: swift rx-swift frp

我正在使用rxSwift,我有一个可以订阅的可观察词典。

var observables: [String: Observable<Bool>] = [:]

在某些时候,我必须清理其中一些可观察物。我这样做如下

observables.removeValue(forKey: someKey)

用上述线清理可观测量是否足够?观察者是否也被杀死(或者我如何杀死&#34;它)?有人可能已经订阅了observable,然后甚至在从字典中删除它之后它仍然存活并且可能会触发,对吧? 或者当我删除它时,观察结果是否已经消失,因为没有人强烈提及它?当观察者被移除给潜在的受害者时会发生什么?

我无法访问保留带有observables的字典的类的订阅者。

1 个答案:

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