gpt4 book ai didi

swift - 清理可观察对象

转载 作者:行者123 更新时间:2023-11-28 15:39:36 25 4
gpt4 key购买 nike

我正在使用 rxSwift,我有一本可以订阅的可观察对象字典。

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

在某些时候,我必须清理其中的一些 observables。我是这样做的

observables.removeValue(forKey: someKey)

是否足以用上面的行清理 observables? observable 是否也被杀死了(或者我如何“杀死”它)?有人可能已经订阅了 observable,然后即使将它从字典中删除后它仍然存在并且可能会触发,对吧?还是因为没有人对它有很强的引用,所以在我删除它的那一刻 Observable 就消失了?在将可观察对象移除给潜在订阅者的那一刻会发生什么?

我无法从保存带有可观察对象的字典的类中访问订阅者。

最佳答案

您可以使用 takeUntil运算符(operator)。它将向可观察对象发送一个完成信号,因此订阅者将释放保留的资源。

例如,您可以设置一个 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
}

这样,要清理一个可观察对象,您发送可观察对象标识符,然后您可以从字典中删除完整的序列。

func removeObservable(identifier: String) {
// Complete the observable so it stops sending events and subscriber releases resources
finishObservable.onNext(identifier)
observables.removeValue(forKey: identifier)
}

如果您计划在观察者之间共享订阅,您还可以使用 ConnectableObservable。当订阅者来来去去但你想共享相同的订阅时,我使用过这种可观察对象。例如,如果可观察对象获取网络资源,这将很有用。

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

关于swift - 清理可观察对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43886705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com