我已经设置了一个简单的核心数据模式,其中项目对象被添加到列表对象中。生成类之后,核心数据生成了标准访问器,包括将项添加到列表中的几种方法(list.addItemsObjects和list.addItems :)。
我还想添加一个' dateAdded' NSDate到每个项目。现在,我可以在每次创建对象时手动设置它,因为核心数据将为我提供item.dateAdded访问器。但实际上,我更希望这是由列表本身处理的,因为实现永远不会改变。所以每次调用list.AddItemObject时,我都希望它同时设置item的dateAdded属性。我想我也需要在反向中做同样的事情,这样item.setList也会设置dateAdded。
我不知道该怎么做。我是否应该尝试重新定义现有的核心数据生成的访问器?如果是这样,我该怎么做(有人在我的自定义代码中调用原始实现,以便处理反向关系,以及任何其他核心数据必需品)?或者有更好的方法来定制这些方法吗?
答案 0 :(得分:8)
您可以覆盖核心数据生成的访问者。
你必须注意一些特殊的事情,比如调用willChangeValueForKey
和didChangeValueForKey
,但除了那些覆盖访问者的内容与以往几乎相同。
通过大量示例清楚地解释了这一点。请注意一对一和一对多关系之间的区别。
您无需实现反向功能,这是由Core Data完成的。如果您致电list.AddItem
,系统会自动为您调用item.setList
。
只需将您想要的代码添加到item.setList
访问者。这样,您可以保证每次将项目添加到列表时,日期都会相应更新。不要打扰列表访问器。
您的代码类似于:
- (void)setList:(List *)value
{
[self willChangeValueForKey:@"list"];
[self setPrimitiveValue:[NSDate date] forKey:@"dateAdded"]; // use setValue:forKey: if you need KVO for dateAdded
[self setPrimitiveValue:value forKey:@"list"];
[self didChangeValueForKey:@"list"];
}
编辑我已经考虑了另一个想法,您可能想了解以下内容:
如果您自定义列表方法(例如addItemObject
),您还需要自定义setItems
。此外,如果您的项目被添加到不是您自定义的列表的列表中,则当然不会调用您的自定义代码。
另一方面,如果您自定义setList
方法,则如果项目没有更改,则代码不。
例如,如果你打电话
[list addItems:[NSSet setWithObject:item]];
[list addItemsObject:item];
然后项目的setList
访问者只会被调用一次!即使没有任何改变,也始终会调用直接调用item.setList
。