您可以覆盖核心数据生成的访问器。 你必须注意一些特殊的东西,比如调用willChangeValueForKey
和didChangeValueForKey
,但除此之外,覆盖访问器几乎与往常一样。
阅读苹果文档: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
的电话。
谢谢。我已经扫描了它并且现在完全阅读它。我没有看到提到的一部分 - 我是否需要将相同的自定义应用于反向访问器?即我定制list.addItemObject后,我是否也应该自定义item.setList? – 2012-03-11 23:04:31
我已经为你的问题更新了我的答案 – JiaYow 2012-03-11 23:19:16
谢谢,这让我很满意。不过,我并没有使用更简单的setList,而是将自定义添加到了list.addItemsObject(参考多对多文档)。我发现它在我调用item.setList时没有被调用。 – 2012-03-11 23:39:24