[Swift]Swift4.0的KVO

KVO原理及Objc的实现不再赘述
简单说一下Swift4.0以后更为科学的KVO:
官方文档:

func observe(_ keyPath: KeyPath, options: NSKeyValueObservingOptions = default, changeHandler: @escaping (EKInformationListController, NSKeyValueObservedChange) -> 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类监听的话,基本上是没有问题的

你可能感兴趣的:([Swift]Swift4.0的KVO)