ios - 如果 KVO 观察到的值在短时间内发生两次变化,那么 observeValueForKeyPath() 会发生什么?

标签 ios iphone multithreading swift key-value-observing

据我了解,由于我没有为我的 KVO 使用单独的线程(Swift 中的 observeValueForKeyPath),当我观察到的值发生变化时,将使用同一线程调用 observeValueForKeyPath()。我不确定的是说我在 observeValueForKeyPath() 中间,然后值再次改变,会发生什么?我现在的执行会不会被打断,又从observeValueForKeyPath()的开头重新开始?在这种情况下,一旦后一个 observeValueForKeyPath() 完成,我是否会恢复到被打断的前一个 observeValueForKeyPath()?在这种情况下,如果我在 observeValueForKeyPath() 中操作数据,我想它会导致竞争条件。 谢谢。

最佳答案

KVO 真的很酷。实际发生的事情(由 mike ash 发现)是运行时将子类化您的 observed 对象,并覆盖正在观察的属性的 setter。重写的 setter 有额外的指令,最终会为 observing 对象显式调用 -observeValueForKey

那么,如果您从 -observeValueForKey 更改指定键路径处的值,会发生什么情况,您最终将得到 -observeValueForKey 消息被发送到observed(相同的)对象。所以正如你所说,你当前的执行将被中断,一些与 KVO 相关的堆栈帧将被放置在你的调用堆栈上,如果一切都正确解决,你将像往常一样继续。

当然,令人厌烦的是,如果在 -observeValueForKey 中针对某个对象,您总是 启动对同一对象的通知。您将陷入无限循环,您的应用程序将崩溃。

而且我不会将您所描述的称为竞争条件,因为在任何时候都不会有两个对象试图同时读/写一个对象。您只需要厌倦阅读和写作的顺序,因为这可能不是您所期望的

关于ios - 如果 KVO 观察到的值在短时间内发生两次变化,那么 observeValueForKeyPath() 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35122342/

相关文章:

ios - 使用 AVMutableVideoComposition 导出时出现视频方向问题

java - SwingWorker线程同步

等待锁定未(明显)锁定的对象的 Java 线程

java - 同步方法有自己的锁吗?

javascript - 有没有办法使用 JavaScript 控制 iPod Touch 的键盘方向?

ios - 自动更新 iOS 7 专用应用程序

ios - JSON 到自定义对象数组 (Swift)

ios - 识别哪个 UISwitch 被点击

iphone - CCSpriteBatchNode : Does the Child of Child receive drawing performance gains?

iphone - fmodf 获取模数的问题