托管对象发生故障时如何正确处理 KVO 通知?

Posted

技术标签:

【中文标题】托管对象发生故障时如何正确处理 KVO 通知?【英文标题】:How to properly deal with KVO notifications when an managed object turns into a fault? 【发布时间】:2010-06-13 11:38:14 【问题描述】:

来自docs:

当 Core Data 把一个对象变成一个 故障,键值观察(KVO) 更改通知(请参阅键值 观察编程指南)已发送 对于对象的属性。如果你 正在观察对象的属性 这变成了故障并且 随后发现故障,您 接收更改通知 其值没有的属性 事实改变了。

所以如果一个对象发生故障,Core Data 是否会发送 KVO 通知以更改属性?所以我必须始终检查 isFault == NO,然后才能对通知感到满意?

【问题讨论】:

【参考方案1】:

isFault 不可靠,因为isFault 在发送 KVO 通知时仍可能返回 NO。应该检查faultingState

faultingState 返回一个值,指示故障状态 接收器。

(NSUInteger)faultingState 返回值 0 如果对象完全初始化为托管对象并且不转换为或从 另一个状态,否则是其他一些值。

讨论 该方法允许您确定一个对象是否在一个 接收键值观察变化时的过渡阶段 通知。

【讨论】:

【参考方案2】:

这是一种解决方案。更好的解决方案是在对象变成故障时停止观察它。在实践中,除了内存不足的情况外,您知道对象何时会变成故障并可以进行计划。

【讨论】:

总结一下:我强烈反对将 NSManagedObject 与 KVO 一起使用?因为我不希望我的 KVO 依赖于错误并制作任何胶水代码以使其与 NSManagedObject 一起使用。你会推荐什么? Core Data 编程指南中也没有有用的提示:(developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/… 一点也不。这只是了解边缘在哪里的问题。

以上是关于托管对象发生故障时如何正确处理 KVO 通知?的主要内容,如果未能解决你的问题,请参考以下文章

KVO:如何告诉观察者,那个自我改变了?

iOS KVO详解

KVO的实现原理

iOS KVO详解

如何调试对象发送 KVO 通知的原因?

KVO-理解与简单使用