将自定义方法添加到子类NSManagedObject

时间:2010-01-27 21:24:17

标签: cocoa inheritance core-data subclass

我有一个核心数据模型,我有一个实体A,这是一个抽象。实体B,C和D继承自实体A.实体A中定义了几个由B,C和D使用的属性。

我想在我的模型代码中利用这种继承。除了属性之外,我想知道是否可以向实体A添加方法,这些方法在它的子实体中实现。

例如:

  1. 我为实体A的接口添加了一个方法,它返回一个值并接受一个参数
  2. 我将此方法的实现添加到A,B,C,D
  3. 然后,我调用executeFetchRequest:来检索B
  4. 的所有实例
  5. 我在检索到的对象上调用该方法,该方法应该调用B实现中包含的方法的实现
  6. 我试过这个,但在调用方法时,我收到了:

      

    [NSManagedObject methodName:]:   无法识别的选择器发送到实例

    我认为这是因为executeFetchRequest:返回的对象是某种代理对象。

    有没有办法利用子类化的NSManagedObjects来利用继承?

    我真的希望能够这样做,否则我的模型代码将负责确定它正在处理的NSManagedObject的类型,并根据类型执行特殊逻辑,这是不可取的。

    提前感谢任何帮助。

4 个答案:

答案 0 :(得分:25)

它应该工作。 executeFetchRequest:返回的对象是NSManagedObject s(或其子类)的实例。 在CoreData中使用自定义类的步骤如下。假设您有实体A和B,其中B继承自A. 然后你需要两个自定义类

@interface A:NSManagedObject{
}
-(void)someMethod:(NSString*)a;
@end;
@interface B:A{
}
-(void)someMethod:(NSString*)a;
@end;

然后在XCode数据建模器中设置它们,如下所示:

screenshot of XCode modeler

这样,当从数据库中获取时,CoreData会自动为NSManagedObject分配正确的类。

答案 1 :(得分:18)

如果您收到该异常,则表示Core Data未使用您的自定义类。这里的关键是NSManagedObject - 这是为数据存储中的对象创建的对象Core Data。

如果您还没有,则需要创建一个继承自NSManagedObject的类,在那里添加自定义方法,然后设置实体A以在对象中使用自定义类模型工具。如果实体BCD等具有特定行为,则应将您为实体A创建的类子类化,并将这些实体分配为使用子类。

基本上,您有一个并行层次结构:一个实体层次结构,另一个类别。对于对象模型中的每个实体,您最终可能会得到实体X和类X

答案 2 :(得分:2)

在尝试使用我的自定义方法之前尝试了很多解决方案,在我的NSManagedObject子类上调用isMemberOfClass后,这就成了伎俩。

[thing isMemberOfClass:[Thing class]];
[thing customMethod]; //was getting unrecognized selector sent to instance here before

答案 3 :(得分:1)

由于同样的潜在原因,我也有同样的错误,但它出现在不同的情况和不同的治疗方法。你的建议给了我很多帮助!

最初我创建了我的课程,手工实现我的入门。我不知道有一个Xcode菜单。我认为链接从未出现过!所以直到我添加并开始测试新的自定义方法(不是setter / getters)才开始出错。

我的解决方案是更改我的类的名称,让Xcode通过Editor->Create NS Mangage Object....为我的条目重新创建类,然后将旧代码剪切并粘贴到新类中。代码没有区别!

Xcode似乎有某种内部链接在代码中不明显。