KVO与通知NSNotification学习笔记
KVO
KVO简介
KVO可以用于监听某个对象属性值的改变。
KVO原理
- 当一个对象使用了KVO监听,iOS系统会修改这个对象的isa指针,
- 改为指向一个全新的通过Runtime动态创建的子类,子类拥有自己的set方法实现,
- set方法实现内部会顺序调用willChangeValueForKey方法、原来的setter方法实现、
- didChangeValueForKey方法,而didChangeValueForKey方法内部
又会调用监听器的observeValueForKeyPath:ofObject:change:context:监听方法。
KVO在swift中的运用
默认情况下,Swift类中禁用了KVO。
要想使用KVO,需要将基类设置为NSObject并在变量中添加@objc动态属性
class Person: NSObject {
@objc dynamic var name: String
}
class PersonObserver {
var kvoToken: NSKeyValueObservation?
func observe(person: Person) {
kvoToken = person.observe(\.name, options: .new) { (person, change) in
guard let name = change.new else { return }
}
}
deinit {
kvoToken?.invalidate()
}
}
NSNotification
NSNotification简介
- 是iOS中一个调度消息通知的类,采用单例模式设计,在程序中实现传值、回调等地方应用很广。在iOS中,NSNotification 和 NSNotificaitonCenter是使用观察者模式来实现的用于跨层传递消息
- 可以实现一对多,NSNotification 的实际是一种观察者模式。
NSNotification原理
待补充
订阅通知
NotificationCenter.default.addObserver(self, selector: #selector(disconnect), name: Notification.Name("disconnect"), object: nil)
@objc func disconnect(){
isConnected = false
}
发送通知
NotificationCenter.default.post(name: Notification.Name("disconnect"), object: nil)
移除通知
deinit {
NotificationCenter.default.removeObserver(self)
}
-
在iOS9之前:不是一个类似OC中的weak类型,持有的相当与一个__unsafe_unretain指针对象,当对象释放时,会访问已经释放的对象
-
在iOS9后不需要手动移除通知,通知中心持有的是注册者的weak指针,这时即使不对通知进行手动移除,指针也会在注册者被回收后自动置空