【问题标题】:How to remove an KVO observer added with observe() API? [duplicate]如何删除使用 observe() API 添加的 KVO 观察者? [复制]
【发布时间】:2019-12-23 06:07:30
【问题描述】:

我读到NSObject.observe<Value>() 是用于注册 KVO 观察者的新 API(在 Swift 4 中引入),它支持 Swift 键路径表达式和闭包。我想知道新 API 中注销观察者的方法是什么?

observe<Value>() 方法返回一个NSKeyValueObservation 对象,该对象没有显式取消观察的方法(根据其代码,当对象被 ARC 释放时,它会隐式执行此操作)。所以似乎唯一的方法是使用旧的NSObject.removeObserver(),它使用旧的 keypath String 参数?

我还发现很难找到这个observe() API 的文档。在NSObject doc 中没有提到它(该文档包含observeValue() 的描述但不是这个observe<Value>),并且XCode 中的代码完成不适用于它。我发现苹果官方文档中提到的唯一地方是这篇文章Using Key-Value Observing in Swift。这让我想到这是不完整的还是正在进行的工作? (但鉴于它是在 Swift 4 时间框架中引入的,我对此表示怀疑)。

【问题讨论】:

    标签: ios swift key-value-observing


    【解决方案1】:

    使用键值观察的示例

    /// define an Observer
    var observation: NSKeyValueObservation?
    override func viewDidLoad() {
        super.viewDidLoad()
        /// start observation
        observation = view.observe(\.backgroundColor, options: [.old, .new], changeHandler: { (view, value)  in
        })
        /// invalidate observation
        observation?.invalidate()
        observation = nil
    }
    

    【讨论】:

    • 谢谢。我看到了invalidate() 方法,但它的名字对我来说有点奇怪,而且它的文档没有描述,所以我忽略了它。既然你说了,我用谷歌搜索了这个方法,发现我的问题也在这里得到了回答:stackoverflow.com/questions/46591637/….
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多