【问题标题】:Providing your own setter for a CoreData property / attribute为 CoreData 属性/属性提供您自己的设置器
【发布时间】:2012-05-31 23:42:58
【问题描述】:

我有一个具有多个属性的实体,其中一个称为 lastModificationDate。每当设置任何对象的属性时,我都想更新 lastModificationDate。

如果我不使用 Core Data,我只需提供我自己的属性设置器并更新 lastModificationDate。但是,我不确定是否应该弄乱 CoreData 的属性。

最好的方法是什么?

【问题讨论】:

标签: objective-c cocoa-touch core-data properties


【解决方案1】:

如果您正在使用 NSManagedObject 子类,则不应覆盖属性修改器(setter),因为这些实现是在运行时提供的(因此@dynamic 而不是@synthesize)。如果你真的想要,你可以,但它更混乱,没有理由这样做。请改用键值观察 (KVO)。它会在值更改时通知您。

Apple 的 KVO 文档很棒:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html#//apple_ref/doc/uid/10000177i

【讨论】:

  • 是的,KVO 很可能是正确的解决方案,但您的其余答案是错误的。查看核心数据编程指南Managed Object Accessor Methods。在 Xcode 的 sn-p 库中实际上还有一个名为 Core Data property Accessors 的代码 sn-p,它为您提供了如何覆盖这些方法的基本概述。
  • 这可能没有意义,但你的回答说你做不到,因此我的评论。
【解决方案2】:

覆盖设置器很容易完成,您必须确保触发正确的通知以使其他一切正常工作(包括 KVO)。

- (void) setThing:(NSObject *)myThing {
  self.lastUpdateDate = [NSDate date];
  [self willChangeValueForKey:@"thing"];
  [self setPrimitiveThing:myThing];
  [self didChangeValueForKey:@"thing"];
}

话虽如此,如果您需要做的只是我展示的代码(本质上是设置值并更新上次更新日期),那么最好使用键值观察并对通知做出反应。它更简单、更清洁。

【讨论】:

  • 如果核心数据框架在幕后发生变化,那可能会发生灾难性的破坏。但是,是的,这暂时可行。
  • 实际上,虽然建议(出于您提到的原因之外的其他原因)不实现自定义访问器,但该技术在 Apple's documentation 中有详细记录
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-15
  • 2017-01-08
相关资源
最近更新 更多