KVO原理及Objc的实现不再赘述
简单说一下Swift4.0以后更为科学的KVO:
官方文档:
func observe<Value>(_ keyPath: KeyPath<EKInformationListController, Value>, options: NSKeyValueObservingOptions = default, changeHandler: @escaping (EKInformationListController, NSKeyValueObservedChange<Value>) -> Void) -> NSKeyValueObservation
Description
when the returned NSKeyValueObservation is deinited or invalidated, it will stop observing
使用方法也很简单,比如我们监听某个view的frame:
observation = xxview.observe(\UIView.frame, options: [.new]) { (_, change) in
///frame的类型时CGRect 不像原来从字典取值还需要转换
let frame = change.newValue
}
相较原来Objc的处理方式,Swift 4.0 KeyPath 有一下优势:
- 1 原来的监听KeyPath使用的是字符串,有可能造成人为的错误
- 2 设定观察和处理观察代码放在一起,代码维护难度降低;
- 3 不需要使用context来区分是哪个观察量发生变化;
- 4 处理时得到的是类型安全的结果,不是在字典中取值;
- 5 observation被观察者持有,生命周期随着观察者的释放而结束,不像原来还需要寻找时机移除观察者
毕竟是在Swift中使用,还是有一些限制的,如果相对我们自己写的类进行属性监听的话需要对属性使用dynamic 和 @objc 进行修饰,不过如果是对苹果原生的NSObject类监听的话,基本上是没有问题的
网友评论