当前位置: 首页 > 面试题库 >

在Swift 4中,如何删除基于块的KVO观察器?

宇文智敏
2023-03-14
问题内容

如果我这样存储观察者:

let observer: NSKeyValueObservation = foo.observe(\.value, options: [.new]) { (foo, change) in
    print(change.newValue)
}

observer一旦不再需要我该如何删除/禁用/清理?

我的foo实例没有remove接收到NSKeyValueObservation实例的任何类似方法,observer本身也没有任何remove类似的方法。


问题答案:

在iOS 11中,您不必这样做。只是让观察者超出范围即可。让观察者在观察者之前死亡或让被观察者在观察者之前死亡不再有任何惩罚,因此您没有实际工作要做。

另一方面,如果您确实
注销观察者,则将其从保留它的内容中删除,或告诉它invalidate。(某些东西必须保留下来,因为如果您不坚持观察者,观察者 将死亡,
并且永远不会调用观察者函数。)

(您说的是“如果我这样存储观察者”,但是使用let来存储观察者的方式有点愚蠢。存储观察者的方法更好。最好将其放在Set中,以后可以从中删除它,或至少将其存储在Optional中var,您以后可以将其设置为nil。)



 类似资料:
  • 键值观察 - KVO 在 KVO 里,对象可以注册监听任何属性的变化,不管它是否持有。如果感兴趣的话,可以读一读苹果 KVO 编程指南。 如何使用 KVO 正如前面所提及的, 对象可以关注任何属性的变化。在我们的例子里,我们可以用 KVO 关注 UIImageView 的 image 属性变化。 打开 AlbumView.swift 文件,找到 init(frame:albumCover:) 方法

  • 问题内容: 由于和不可用,我应该在哪里删除Swift 中的观察器? 问题答案: 使用以下方法,其功能与相同。 在取消释放类实例之前,将调用反初始化器。您使用deinit关键字编写反初始化器,类似于使用init关键字编写初始化器。反初始化器仅在类类型上可用。 迅捷反初始化器

  • 此外,为什么Viewmodel不能观察到它自己的LiveData的变化?

  • 问题内容: 如果是这样,那么在Objective-C中使用键值观察时是否没有其他键差异? 问题答案: (编辑以添加新信息):考虑使用Combine框架是否可以帮助您完成所需的工作,而不是使用KVO 是的,没有。KVO一直以来都在处理NSObject子类。它不适用于不继承NSObject的类。斯威夫特(目前至少)没有自己的原生观察系统。 (有关如何将其他属性公开为ObjC的信息,请参见注释,以便KV

  • 我来自同步编程背景,我很难理解可观察性。 这是我的服务/提供商的摘录(离子2项目) 我将从订阅它。关于这一点,我有几个问题。 > 即使我没有声明,上面的代码是否返回一个可观察/观察者? 响应是JSON。如何检查/处理JSON并执行一些操作,如 那就做吧 我认为应该在提供者类中完成。只是一个典型的提示/例子将是真棒。 当请求到达subscribe方法时,它是否真的发生了? 创建和返回Angular

  • 问题内容: 阅读针对iOS 9的这篇文章后,我知道您不再需要removeObserver。 然而,对于iOS 8的,你需要给 removeObserver 在中的viewController的方法。但我无法理解。如果一个viewController被释放,那么它的DEAD不是吗?为什么我们需要做一个removeObserver。作为观察员就像打电话给永远不会接电话的死者一样 我不明白什么? 问题答