KVO提供了一种机制,当指定对象的属性的属性被修改后,observer就会接到通知。KVO其实是“观察者”设计模式的一种应用。这种模式有利于两个类间的解耦合,比如Model和Controller间的解耦合。
文章提到了负责处理业务逻辑的Walker类和负责视图控制的ViewController类,其中一点是ViewController需要将Walker的属性显示出来,并实时更新。例子列举了4种方法,突出了KVO模式的优点。
文章中提到两点:
1 Swift中使用KVO仅限于NSObject子类
2 要将观测的对象标记为dynamic
原因可以理解,KVO基于KVC和动态派发技术实现,这些都是Objective-C运行时的概念。Swift为了效率,禁用了动态派发。
大多数情况下,我们需要观察的属性不一定有dynamic修饰,文章也给出了解决办法。
当你要观察一个对象时,一个新的类会被动态创建,这个类继承当前类,并重写了被观察属性的setter方法,setter方法中会调用willChangeValueForKey和didChangeValueForKey。然后通过isa swizzling将isa指针指向新创建的子类,于是对象就变成了新创建子类的实例。
网友评论