Swift4.0下的KVO

05. 十二月 2017 iOS 0

KVO是OC中不可或缺的一个重要API,一直以来在Swift中都支持的不是很好。 4.0以前有一些使用的限制条件,本文就只针对4.0以上进行讨论

KVO对象NSObject

4.0后KVO依旧是只能针对NSObject才能使用

观察一个内部属性

属性前必须要加@objc dynamic,因为kvo需要用oc的runtime特性来进行观察。 不加的话会报错(例如string属性):Fatal error: Could not extract a String from KeyPath Swift.ReferenceWritableKeyPath<testMedia.ViewController, Swift.String>

吃个🐔:

ABaby实例自己观察Baby的Name变化,一般不推荐这种用法,因为有更好的属性观察器可以使用

🌟1. KVO新的API不用我们去主动remove observe,但是会给我们一个NSKeyValueObservation对象,我们需要对这个对象进行管理。同时也要注意闭包的使用。注意循环引用等问题

🌟2.语法\.babyName中的\.\ABaby.babyName的简写(当然可以在代码中这样写,更加方便),iOS11(Xcode 9.0+)中新的KeyPath写法。例子中是KeyPath<ViewController, Value>

支持外部观察

如果baby的外公需要及时知道Baby的name,那么我们的Baby类就需要支持外部观察。Swift4.0中需要显示针对某个类型是动态的话需要加关键字@objc dynamic,但是如果有多个属性都写@objc,比较麻烦。这时有个新关键字@objcMembers对类声明。

吃个🐔

🌟新的kvo方法支持对象的所有动态属性(dynamic),包括基础类型

总结

🌟老的addObserver这个方法不推荐使用了,针对基础属性无法监听,而且需要remove observe这种麻烦的操作

🌟在使用新的API时一定要注意的是,监听注册后的返回对象生命周期,否则可能无法收到监听的变化


发表评论