扩展CoreDataGeneratedAccessors行为

时间:2010-11-20 21:36:24

标签: cocoa core-data

我有一个带有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”。在课程中添加一个观察者NSSet似乎也许是一种方法,但我宁愿只实现自己的访问器,然后定义它是如何工作的,就像实现@synthesized访问器超出默认行为时一样。

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

思考?其他方法?

感谢。

2 个答案:

答案 0 :(得分:7)

复制到剪贴板功能似乎在Xcode 4中消失了。另一种方法是转到代码段库(View / Utilities / Code Snippet Library)并将其中一个“Core Data xxx Accessors”拖到.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];
}

您需要替换&lt; #Capitalized relationship name#&gt;,&lt; #Relationship destination class#&gt;和&lt; #Relationship name#&gt ;,然后添加您的自定义代码。 (因为我使用ARC,我还必须删除[changedObjects release]。)

答案 1 :(得分:4)

您无法覆盖访问者,只需在.m文件中编写自己的访问者。

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