扩展 CoreData 生成的访问器行为

Posted

技术标签:

【中文标题】扩展 CoreData 生成的访问器行为【英文标题】:Extend CoreDataGeneratedAccessors Behaviour 【发布时间】:2010-11-20 21:36:24 【问题描述】:

我有一个带有 CoreDataGeneratedAccessors 的 NSManagedObject 子类,如下所示:

- (void)addCoursesObject:(Course *)value;
- (void)removeCoursesObject:(Course *)value;
- (void)addCourses:(NSSet *)value;
- (void)removeCourses:(NSSet *)value;

当使用上面的访问器添加或删除对象时,我需要一些其他代码来运行。

我实际上想在实现文件中做这样的事情:

-(void)addCoursesObject:(Course *)value 
    [super addCoursesObject:value];
     … my additional code here … 

但是 super 没有意义,因为 NSManagedObject 没有“-addCourseObject”。在 Courses NSSet 上添加观察者似乎是一种方法,但我宁愿只实现我自己的访问器,然后定义它的工作方式,就像实现 @synthesized 访问器以超越默认行为时一样。

有没有办法调用原始行为,类似于上面的 '[super...' 行?

想法?其他方法?

谢谢。

【问题讨论】:

【参考方案1】:

复制到剪贴板功能似乎在 Xcode 4 中消失了。另一种方法是进入代码 sn-p 库(视图/实用程序/代码片段库)并将其中一个“核心数据 xxx 访问器”拖到您的 . m 文件。你会得到这样的方法:

- (void)add<#Capitalized relationship name#>Object:(<#Relationship destination class#> *)value     
    NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
    [self willChangeValueForKey:@"<#Relationship name#>" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
    [[self primitiveValueForKey:@"<#Relationship name#>"] addObject:value];
    [self didChangeValueForKey:@"<#Relationship name#>" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
    [changedObjects release];

您需要替换、 和,然后添加您的自定义代码。 (我还必须删除 [changedObjects release],因为我使用的是 ARC。)

【讨论】:

小心这种方法。自从我发布了这个答案以来,我遇到了几个删除方法并没有真正删除对象的问题。当我删除该方法并将我的自定义代码移动到调用级别时,它再次起作用。我现在怀疑 Apple 可能不会让这些代码 sn-ps 保持最新,这样做可能是个坏主意。【参考方案2】:

您不能覆盖访问器,您只需在 .m 文件中写入您自己的。

在数据模型编辑器中,如果选择关系,则可以从上下文菜单中选择“将 Objective-C 2.0 实现复制到剪贴板”。这将为您提供访问器的功能框架。然后,您可以轻松地自定义它们。

【讨论】:

关于副本的好提示。我在文档中找到了足够多的东西来拼凑一些有用的东西,但是如果我首先认识到该菜单项的作用,我会节省大量的工作。所以下一次,我会适当地武装起来。非常感谢,TechZen。 19k+1 给你。 ;) 很遗憾,Xcode 5 中没有复制上下文菜单。

以上是关于扩展 CoreData 生成的访问器行为的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法为 Core Data 原始访问器自动生成 @property 和 @dynamic 标签?

lm() 和 predict.lm() 的奇怪行为取决于显式命名空间访问器的使用

核心数据原始访问器

核心数据 - 原始设置器/获取器更快吗?啥时候不使用?

CoreData:第一次加载 NSManagedObject 时未访问自定义属性访问器

Swift 中的 NSManagedObject 子类不能使用自定义访问器?