自定义核心数据访问器——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 子类不能使用自定义访问器?

执行删除规则时未调用自定义对多关系访问器方法

springboot核心技术-----Docker数据访问自定义starter

核心数据 SQLite 加密?

从自定义框架访问 Coredata 时应用程序崩溃

空间配置器