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

Ben*_*ard 9 core-data objective-c ios

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

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

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

Jia*_*Yow 8

您可以覆盖核心数据生成的访问者.你必须注意一些特殊的东西,比如调用willChangeValueForKeydidChangeValueForKey,但除了覆盖访问器之外几乎和往常一样.

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

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

您不需要实现反向功能,这是由Core Data完成的.如果你打电话list.AddItem,那么item.setList会自动为你打电话.

所以只需将您想要的代码添加到item.setList访问者.这样,您可以保证每次将项目添加到列表时,日期都会相应更新.不要打扰list-accessors.

你的代码是这样的:

- (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"];
}
Run Code Online (Sandbox Code Playgroud)

编辑我已经给了它另一个想法,你可能想知道以下内容:

如果您自定义列表方法(即addItemObject),您还需要自定义setItems.此外,如果您的项目被添加到不是您自定义的列表的列表中,则当然不会调用您的自定义代码.

另一方面,如果您自定义setList方法,则如果项目没有更改,则不会调用代码.

例如,如果你打电话

[list addItems:[NSSet setWithObject:item]];
[list addItemsObject:item];
Run Code Online (Sandbox Code Playgroud)

那个项目的setList访问者只会被调用一次!item.setList即使没有任何改变,也会始终调用直接调用.