定制核心数据生成访问器

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

我也想为每个项目添加一个'dateAdded'NSDate。 现在,我可以每次创build一个对象时手动设置它,因为核心数据会为我提供一个item.dateAdded访问器。 但是真的,我宁愿这是由列表本身处理,因为实现永远不会改变。 所以每次我调用list.AddItemObject,我都想同时设置该项目的dateAdded属性。 我想我也需要做同样的反过来,所以item.setList也设置了dateAdded。

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

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

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

有很多例子可以清楚地解释。 只要注意一对一和一对多关系的区别。

您不需要实现逆function,这是由Core Data完成的。 如果你调用list.AddItem ,那么item.setList将自动被你调用。

所以只需要添加你想要的代码到item.setList访问器。 这样,您保证每次将项目添加到列表中时,相应地更新date。 不要打扰列表访问器。

你的代码会是这样的:

 - (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总是被调用,即使没有改变。