扩展CoreDataGeneratedAccessors行为

Woo*_*ter 2 cocoa core-data

我有一个NSManagedObject子类与CoreDataGeneratedAccessors如下:

- (void)addCoursesObject:(Course *)value;
- (void)removeCoursesObject:(Course *)value;
- (void)addCourses:(NSSet *)value;
- (void)removeCourses:(NSSet *)value;
Run Code Online (Sandbox Code Playgroud)

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

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

-(void)addCoursesObject:(Course *)value {
    [super addCoursesObject:value];
     … my additional code here … }
Run Code Online (Sandbox Code Playgroud)

但是super没有意义,因为NSManagedObject没有"-addCourseObject".在课程中添加一个观察者NSSet似乎也许是一种方法,但我宁愿只实现自己的访问器,然后定义它是如何工作的,就像实现@synthesized访问器超出默认行为时一样.

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

思考?其他方法?

谢谢.

Sym*_*ric 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];
}
Run Code Online (Sandbox Code Playgroud)

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

  • 小心这种方法.由于我发布了这个答案,我遇到了几个删除方法没有实际删除对象的问题.当我删除该方法并将我的自定义代码移动到调用级别时,它再次起作用.我现在怀疑Apple可能不会更新这些代码片段,这样做可能是一个坏主意. (2认同)