我正在关注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
属性。我甚至不知道为什么我们需要primitiveDate
和date
时才定义processId
。我尝试在行之间读取(在读完所有行之后),但仍然无法得到它。你能帮忙吗?我不知道我错过了什么。
答案 0 :(得分:3)
重要的一行是
原始访问器不会发出KVO通知,导致将更改记录为单独的撤消事件。
在您引用的文档中。
之间的区别self.date = [NSDate date];
和
self.primitiveDate = [NSDate date];
是前者发布Key-Value-Observing(KVO)通知,但后者不发布。 Cocoa + CoreData的内置撤消系统查找KVO通知以正确准备撤消堆栈。这意味着,如果您执行前者,则可以从UI中撤消该操作,这可能是您不想要的。
这是一个微妙的差异,随着您的计划变得更大,更成熟,这一点变得非常重要。