自定义核心数据访问器——setValue:forKey: vs. setPrimitiveValue:forKey:
Posted
技术标签:
【中文标题】自定义核心数据访问器——setValue:forKey: vs. setPrimitiveValue:forKey:【英文标题】:Custom Core Data Accessors -- setValue:forKey: vs. setPrimitiveValue:forKey: 【发布时间】:2013-07-26 20:25:04 【问题描述】:我了解原始 setter 和非原始 setter(KVO 通知等)之间的区别。但是,如果我编写自己的 setValue:forKey: 并调用 setPrimitiveValue:forKey:,我是否必须将 SAME 值传递给它?我阅读了文档,我用谷歌搜索了它,但我根本找不到任何关于这个的讨论。
编辑:谢谢,adpalumbo 和 Dave FN。你们都同意它不必是相同的值。我真正的问题是这个。我编写自己的 setter 和 getter。然后我在 NSManagedObject 上调用 setter 以更改其原始值,但由于自定义 getter 的编写方式,它仍然返回旧值(原始值已被修改。但如果您在修改前后调用自定义 getter ,您将看不到任何变化。)。在此之后,我在 NSManagedObjectContext 上调用 hasChanges 并返回 NO!如果我在上下文中调用 save ,则根本不会保存更改。任何的想法?正常行为?潜在的核心数据错误?
【问题讨论】:
快速回答您的编辑问题,您是否在设置器中调用willChangeValueForKey:
和 didChangeValueForKey:
?
啊……就是这样。我只在遇到问题时添加了 didChangeValueForKey:。添加 willChangeValueForKey: 后,一切正常。这不是核心数据错误,它与返回相同值的自定义 getter 无关。我说我知道 KVO 通知的东西……笑话在我身上!非常感谢 Dave FN!
很容易错过其中一个调用,因为它们是为非核心数据对象自动添加的,但在这种情况下不会。我已经用正确的修复更新了我的答案。很高兴能提供帮助。
【参考方案1】:
没有。这是它的用途之一。
您可以在setValue:forKey:
中获取一个复杂对象并将其序列化为NSData
,或者在调用setPrimitiveValue:forKey:
之前将其缩减为某个引用标识符。
【讨论】:
【参考方案2】:不,您不必将相同的值传递给原始存储。就像非核心数据对象一样,setter 可以为实例变量分配任何值。
当然,当您调用 valueForKey:
时,您将得到传递给原始存储的任何内容,而不是最初传递给 setValue:forKey:
的内容,除非您还覆盖它并返回其他内容。
编辑
覆盖 Core Data 设置器时,请确保将 setPrimitiveValue:forKey:
包装为 willChangeValueForKey:
和 didChangeValueForKey:
。
【讨论】:
以上是关于自定义核心数据访问器——setValue:forKey: vs. setPrimitiveValue:forKey:的主要内容,如果未能解决你的问题,请参考以下文章
Swift 中的 NSManagedObject 子类不能使用自定义访问器?