2012-03-11 69 views
9

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

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

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

回答

8

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

阅读苹果文档: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的电话。

+0

谢谢。我已经扫描了它并且现在完全阅读它。我没有看到提到的一部分 - 我是否需要将相同的自定义应用于反向访问器?即我定制list.addItemObject后,我是否也应该自定义item.setList? – 2012-03-11 23:04:31

+0

我已经为你的问题更新了我的答案 – JiaYow 2012-03-11 23:19:16

+0

谢谢,这让我很满意。不过,我并没有使用更简单的setList,而是将自定义添加到了list.addItemsObject(参考多对多文档)。我发现它在我调用item.setList时没有被调用。 – 2012-03-11 23:39:24