自定义核心数据生成的访问者

时间:2012-03-11 21:26:23

标签: objective-c ios core-data

我已经设置了一个简单的核心数据模式,其中项目对象被添加到列表对象中。生成类之后,核心数据生成了标准访问器,包括将项添加到列表中的几种方法(list.addItemsObjects和list.addItems :)。

我还想添加一个' dateAdded' NSDate到每个项目。现在,我可以在每次创建对象时手动设置它,因为核心数据将为我提供item.dateAdded访问器。但实际上,我更希望这是由列表本身处理的,因为实现永远不会改变。所以每次调用list.AddItemObject时,我都希望它同时设置item的dateAdded属性。我想我也需要在反向中做同样的事情,这样item.setList也会设置dateAdded。

我不知道该怎么做。我是否应该尝试重新定义现有的核心数据生成的访问器?如果是这样,我该怎么做(有人在我的自定义代码中调用原始实现,以便处理反向关系,以及任何其他核心数据必需品)?或者有更好的方法来定制这些方法吗?

1 个答案:

答案 0 :(得分:8)

您可以覆盖核心数据生成的访问者。 你必须注意一些特殊的事情,比如调用willChangeValueForKeydidChangeValueForKey,但除了那些覆盖访问者的内容与以往几乎相同。

阅读Apple文档:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdAccessorMethods.html

通过大量示例清楚地解释了这一点。请注意一对一和一对多关系之间的区别。

您无需实现反向功能,这是由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