Swift Extension中的KVO

时间:2016-08-06 15:16:04

标签: ios swift key-value-observing

我如何获得我的扩展程序来观察它所扩展的类的属性,同时还可以在以后删除它?

例如:

我有一个UIView,我想在我的UIView扩展中监听帧更改。当发生这些变化时,我需要运行一些代码来改变基于新帧的视图外观。

我遇到的问题是,虽然我可以设置一个观察者,但我无法找到一种方法来删除它。没有deinit(),我希望观察者能够在UIView的生命周期中闲逛。

我宁愿不必将此删除责任交给开发人员,我也不想进行子类化。

它甚至不必是KVO,如果有更好的方式我很想知道它。

2 个答案:

答案 0 :(得分:3)

通常的解决方案是使用关联对象作为释放间谍。关联对象在释放其附加对象时会被释放,因此您可以在附加对象消失时在其deinit中运行要触发的代码。也就是说,在多线程世界中做得非常好,至少可以说有点棘手。我不建议建立自己的。相反,我建议PMKVObserver将为您处理此问题。即使你确实选择建立自己的,你应该研究PMKVObserver如何发挥它的魔力,这样你在实现中就不会过于天真。

在Swift中这样做(不要担心多线程竞争条件)并不太难,但要做得更好,最好在ObjC中完成并桥接到Swift。再次,请参阅棘手的角落案例的代码。

答案 1 :(得分:1)

虽然

  

扩展可以为类添加新的便利初始化器,但它们   无法向班级添加新的指定初始化程序或取消初始化程序。   必须始终提供指定的初始化程序和取消初始化程序   原始的类实现。

所以我认为如果没有子类化,你就无法以任何好的方式处理它。