为什么在Core Data Utility教程中定义了primitiveDate?

时间:2011-09-11 15:07:41

标签: objective-c cocoa core-data

我正在关注Core Data Utlity Tutorial以了解为使核心数据发挥作用所需的基础工作。此实用程序创建Core Data存储并保存进程ID和运行日期&每次运行的时间。它还显示了之前运行的详细信息。

在定义托管对象类之前,一切都很顺利。它的定义如下:

@interface Run : NSManagedObject
{
    NSInteger processId;
}

@property (assign) NSInteger processId;
@property (retain) NSDate* date;
@property (retain) NSDate* primitiveDate;

@end

它定义了2个不同的日期属性。教程还定义了一种在插入新对象时设置primitiveDate的方法。

- (void) awakeFromInsert {
    [super awakeFromInsert];
    self.primitiveDate = [NSDate date];
}

我不明白为什么我们设置primitiveDate而不是date属性。我甚至不知道为什么我们需要primitiveDatedate时才定义processId。我尝试在行之间读取(在读完所有行之后),但仍然无法得到它。你能帮忙吗?我不知道我错过了什么。

1 个答案:

答案 0 :(得分:3)

重要的一行是

  

原始访问器不会发出KVO通知,导致将更改记录为单独的撤消事件。

在您引用的文档中。

之间的区别
self.date = [NSDate date];

self.primitiveDate = [NSDate date];

是前者发布Key-Value-Observing(KVO)通知,但后者不发布。 Cocoa + CoreData的内置撤消系统查找KVO通知以正确准备撤消堆栈。这意味着,如果您执行前者,则可以从UI中撤消该操作,这可能是您不想要的。

这是一个微妙的差异,随着您的计划变得更大,更成熟,这一点变得非常重要。