【问题标题】:Extend CoreDataGeneratedAccessors Behaviour扩展 CoreData 生成的访问器行为
【发布时间】: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...' 行?

想法?其他方法?

谢谢。

【问题讨论】:

    标签: cocoa core-data


    【解决方案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 中没有复制上下文菜单。
    猜你喜欢
    • 2011-12-01
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多