Objective c 为CoreData属性/属性提供自己的setter

Objective c 为CoreData属性/属性提供自己的setter,objective-c,cocoa-touch,core-data,properties,Objective C,Cocoa Touch,Core Data,Properties,我有一个具有多个属性的实体,其中一个称为lastModificationDate。每当设置对象的任何属性时,我都希望更新lastModificationDate 如果我没有使用核心数据,我只会为属性提供自己的setter并更新lastModificationDate。然而,我不确定我是否应该搞乱CoreData的属性 最好的方法是什么?如果您使用的是NSManagedObject子类,那么不应该覆盖属性变量(setter),因为这些实现是在运行时提供的(因此@dynamic而不是@synthes

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

如果我没有使用核心数据,我只会为属性提供自己的setter并更新lastModificationDate。然而,我不确定我是否应该搞乱CoreData的属性


最好的方法是什么?

如果您使用的是NSManagedObject子类,那么不应该覆盖属性变量(setter),因为这些实现是在运行时提供的(因此
@dynamic
而不是
@synthesis
)。如果你真的想的话,你可以,但这更混乱,没有理由这么做。改为使用键值观察(KVO)。当值发生更改时,它会通知您


Apple的KVO文档非常棒:

如果您使用的是NSManagedObject子类,那么不应该覆盖属性变量(setter),因为这些实现是在运行时提供的(因此
@dynamic
而不是
@synthesis
)。如果你真的想的话,你可以,但这更混乱,没有理由这么做。改为使用键值观察(KVO)。当值发生更改时,它会通知您


苹果的KVO文档非常棒:

覆盖setter很容易,您必须确保为所有其他工作(包括KVO)发出正确的通知


这就是说,如果您只需要执行我显示的代码(基本上是设置值并更新上次更新日期),那么最好使用键值观察并对通知作出反应。它更简单、更干净。

覆盖设置程序很容易,您必须确保为所有其他工作(包括KVO)发出正确的通知


这就是说,如果您只需要执行我显示的代码(基本上是设置值并更新上次更新日期),那么最好使用键值观察并对通知作出反应。更简单、更干净。

是的,KVO很可能是正确的解决方案,但您的其余答案是错误的。查看核心数据编程指南。实际上,Xcode的代码段库中还有一个名为
核心数据属性访问器
的代码段,它为您提供了如何覆盖这些方法的基本概要。这可能没有什么意义,但您的回答指出您无法做到,因此,我的评论是,KVO很可能是正确的解决方案,但您的其余答案是错误的。查看核心数据编程指南。实际上,Xcode的代码段库中还有一个名为
核心数据属性访问器
的代码段,它为您提供了如何覆盖这些方法的基本概述。这可能没有什么意义,但您的回答说您不能这样做,因此我发表了评论。如果核心数据框架在幕后发生变化,这可能造成灾难性的破坏。但是,是的,这将暂时奏效。事实上,虽然建议(出于您提到的原因以外的其他原因)不要实现自定义访问器,但如果核心数据框架在幕后发生变化,这项技术将被大量记录,这可能会造成灾难性的破坏。但是,是的,这将暂时起作用。实际上,虽然建议(出于您提到的原因以外的其他原因)不要实现自定义访问器,但这项技术在可能重复的
- (void) setThing:(NSObject *)myThing {
  self.lastUpdateDate = [NSDate date];
  [self willChangeValueForKey:@"thing"];
  [self setPrimitiveThing:myThing];
  [self didChangeValueForKey:@"thing"];
}