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

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

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

最佳答案

您可以覆盖核心数据生成的访问器。
您必须注意一些特殊的事情,例如调用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

关于objective-c - 自定义核心数据生成的访问器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9659028/

10-16 00:46