2012-05-25 42 views
1

我有一个具有多个属性的实体,其中一个名为lastModificationDate。无论何时设置了对象的任何属性,我都想更新lastModificationDate。为CoreData属性/属性提供自己的setter

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

这样做的最好方法是什么?

回答

1

重写制定者很容易做到,你必须确保你开火权通知,一切工作(包括志愿)。

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

这就是说,如果你需要做的就是我的代码显示(基本设定值和更新的最后更新日期),你好得多使用键 - 值观察和反应的通知。它更简单,更清洁。

+0

如果核心数据框架在幕后发生变化,那可能会发生灾难性的变化。但是,是的,现在这会起作用。 –

+0

实际上,虽然建议(除了您提到的其他原因)未实现自定义访问器,但该技术已在[Apple's documentation]中得到充分记录(http://developer.apple.com/library/mac/#documentation/Cocoa /Conceptual/CoreData/Articles/cdAccessorMethods.html#//apple_ref/doc/uid/TP40002154-SW14) – mprivat

0

如果您使用的是NSManagedObject子类,那么您不应该重写属性变量(设置器),因为这些实现是在运行时提供的(因此@dynamic而不是@synthesize)。你可以,如果你真的想,但它更混乱,没有理由。改为使用键值观察(KVO)。当数值发生变化时,它会让你知道。

苹果的志愿文档是伟大的:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html#//apple_ref/doc/uid/10000177i

+2

是的KVO很可能是正确的解决方案,但其余的答案是错误的。检查核心数据编程指南[托管对象访问器方法](http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/coredata/Articles/cdAccessorMethods.html#//apple_ref/doc/uid/ TP40002154-SW5)。实际上Xcode的片段库中还有一个名为“Core Data property Accessors”的代码片段,它给出了如何覆盖这些方法的基本概述。 –

+0

是的,我知道,但它是一团糟,没有意义。 –

+0

有可能没有意义,但你的回答表明你不能这样做,因此我的评论。 –