Swift 扩展中的 KVO
KVO within Swift Extension
我如何让我的扩展程序在 class 上观察 属性 它正在扩展,同时还能够在以后删除它?
例如:
我有一个 UIView,我想监听 UIView 扩展中的框架变化。当这些变化发生时,我需要 运行 一些代码来根据新框架改变视图外观。
我遇到的问题是,虽然我可以设置一个观察器,但我无法找到删除它的方法。没有 deinit() 并且我希望观察者在 UIView 的生命周期中停留。
我宁愿不必将此删除责任推给开发者,我也不想子class。
甚至不必是 KVO,如果有更好的方法我很想知道。
同时
Extensions can add new convenience initializers to a class, but they
cannot add new designated initializers or deinitializers to a class.
Designated initializers and deinitializers must always be provided by
the original class implementation.
所以我认为如果不进行子类化,您将无法以任何好的方式处理它。
通常的解决方案是使用关联对象作为释放间谍。关联对象在它们的附加对象被释放时被释放,因此您可以 运行 在它们的 deinit
中编写代码,当附加对象消失时要触发。也就是说,至少可以说,在多线程世界中真正做到这一点有点棘手。我不建议建立你自己的。相反,我建议使用 PMKVObserver 来为您处理这个问题。即使您确实选择构建自己的,也应该研究 PMKVObserver 如何发挥其魔力,这样您的实现就不会过于幼稚。
在 Swift 中马虎地做这件事(不用担心多线程竞争条件)并不难,但要真正做好,最好在 ObjC 中完成并桥接到 Swift。再次,请查阅代码以了解棘手的极端情况。
我如何让我的扩展程序在 class 上观察 属性 它正在扩展,同时还能够在以后删除它?
例如:
我有一个 UIView,我想监听 UIView 扩展中的框架变化。当这些变化发生时,我需要 运行 一些代码来根据新框架改变视图外观。
我遇到的问题是,虽然我可以设置一个观察器,但我无法找到删除它的方法。没有 deinit() 并且我希望观察者在 UIView 的生命周期中停留。
我宁愿不必将此删除责任推给开发者,我也不想子class。
甚至不必是 KVO,如果有更好的方法我很想知道。
同时
Extensions can add new convenience initializers to a class, but they cannot add new designated initializers or deinitializers to a class. Designated initializers and deinitializers must always be provided by the original class implementation.
所以我认为如果不进行子类化,您将无法以任何好的方式处理它。
通常的解决方案是使用关联对象作为释放间谍。关联对象在它们的附加对象被释放时被释放,因此您可以 运行 在它们的 deinit
中编写代码,当附加对象消失时要触发。也就是说,至少可以说,在多线程世界中真正做到这一点有点棘手。我不建议建立你自己的。相反,我建议使用 PMKVObserver 来为您处理这个问题。即使您确实选择构建自己的,也应该研究 PMKVObserver 如何发挥其魔力,这样您的实现就不会过于幼稚。
在 Swift 中马虎地做这件事(不用担心多线程竞争条件)并不难,但要真正做好,最好在 ObjC 中完成并桥接到 Swift。再次,请查阅代码以了解棘手的极端情况。