Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift扩展中的KVO_Ios_Swift_Key Value Observing - Fatal编程技术网

Ios Swift扩展中的KVO

Ios Swift扩展中的KVO,ios,swift,key-value-observing,Ios,Swift,Key Value Observing,我如何让我的扩展观察它所扩展的类上的属性,同时也能够在以后删除它 例如: 我有一个UIView,我想在UIView扩展中监听帧更改。当发生这些更改时,我需要运行一些代码,根据新的框架更改视图外观 我遇到的问题是,虽然我可以设置一个观察者,但我想不出一种方法来消除它。这里没有deinit(),我希望观察者在UIView的生命周期中一直呆着 我不想让开发者承担这个删除的责任,我也不想把它作为子类 如果有更好的方法我想知道的话,它甚至不必是KVO 扩展可以向类添加新的方便的初始值设定项,但是 无法向类

我如何让我的扩展观察它所扩展的类上的属性,同时也能够在以后删除它

例如:

我有一个UIView,我想在UIView扩展中监听帧更改。当发生这些更改时,我需要运行一些代码,根据新的框架更改视图外观

我遇到的问题是,虽然我可以设置一个观察者,但我想不出一种方法来消除它。这里没有deinit(),我希望观察者在UIView的生命周期中一直呆着

我不想让开发者承担这个删除的责任,我也不想把它作为子类

如果有更好的方法我想知道的话,它甚至不必是KVO

扩展可以向类添加新的方便的初始值设定项,但是 无法向类添加新的指定初始值设定项或取消初始值设定项。 指定的初始值设定人和取消初始值设定人必须始终由 原始类实现

因此,我认为如果不进行子类化,就无法以任何好的方式处理它。

扩展可以向类添加新的方便的初始值设定项,但是 无法向类添加新的指定初始值设定项或取消初始值设定项。 指定的初始值设定人和取消初始值设定人必须始终由 原始类实现


因此,我认为如果不进行子类化,就无法以任何好的方式处理它。

通常的解决方案是使用关联对象作为解除分配间谍。关联对象在解除分配其附加对象时被释放,因此您可以在其
deinit
中运行代码,以便在附加对象离开时启动该代码。也就是说,至少可以说,在多线程世界中真正做好这项工作有点棘手。我不建议你自己建造。相反,我建议由谁来为您处理此问题。即使您选择构建自己的,您也应该研究PMKVObserver是如何发挥其魔力的,这样您就不会对实现过于天真


在Swift中,草率地完成这项工作(不必担心多线程的争用条件)并不难,但要真正做好这项工作,最好在ObjC中完成,并与Swift连接起来。同样,请参考代码以了解棘手的情况。

通常的解决方案是使用关联对象作为解除分配间谍。关联对象在解除分配其附加对象时被释放,因此您可以在其
deinit
中运行代码,以便在附加对象离开时启动该代码。也就是说,至少可以说,在多线程世界中真正做好这项工作有点棘手。我不建议你自己建造。相反,我建议由谁来为您处理此问题。即使您选择构建自己的,您也应该研究PMKVObserver是如何发挥其魔力的,这样您就不会对实现过于天真


在Swift中,草率地完成这项工作(不必担心多线程的争用条件)并不难,但要真正做好这项工作,最好在ObjC中完成,并与Swift连接起来。同样,请参考代码以了解棘手的情况。

我真的希望得到比这简单得多的东西:(我真的希望得到比这简单得多的东西。)(