- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
据我了解,由于我没有为我的 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/
我是一名优秀的程序员,十分优秀!