初始化NSManagedObject的子类的子类

时间:2014-10-09 06:12:16

标签: ios inheritance core-data initialization nsmanagedobject

我从NSManagedObject数据模型生成了这个Core Data子类:

@interface Customer : NSManagedObject
@property (nonatomic, retain) NSNumber * id;
@property (nonatomic, retain) NSString * firstName;
@property (nonatomic, retain) NSString * familyName;
@end

我的应用程序的逻辑让我定义了这个Customer类的子类来扩展它的属性并提供一些方法并将它们与我的数据模型生成的类分开:

@interface ExtCustomer : Customer
@property (nonatomic, retain) NSNumber *modificationDate;
+ (ExtCustomer *)parseJsonData:(NSData *)jsonData;
@end

我不需要保留这个modificationDate属性,我想要的是在整个应用程序中使用ExtCustomer个对象而不是Customer个对象,但只保存{{在需要时通过Customer获得1}}属性。

我尝试实例化Core Data调用ExtCustomer,但这似乎不可能,因为它继承自init,所以我尝试这样做:

NSManagedObject

但是我看到,即使我投射对象(+ (ExtCustomer *)createExtCustomerInContext:(NSManagedObjectContext *)context { NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Customer" inManagedObjectContext:context]; ExtCustomer *customer = [[ExtCustomer alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:context]; [customer setFamilyName:@""]; [customer setFirstName:@""]; return customer; } ),我实际得到的是return (ExtCustomer *)customer;对象。 由于我没有在我的数据模型中定义Customer实体,我想我只能得到ExtCustomer NSEntityDescription。 我怎么能解决这个问题?

提前致谢

2 个答案:

答案 0 :(得分:0)

不幸的是,你的方式不是线程安全的。即使您使用某些东西扩展托管对象,它仍然是托管对象。您不应该通过应用程序保留managedobjects。每当你想使用Customer / ExtCustomer值或使用fetchedResultConnroller与核心同步时,你必须从核心获取。

最简单的解决方案是将modifyDate添加到核心并将其保留在那里。

编辑:

如果您不想触摸核心数据,那么您可以创建ExtCustomer扩展NSObject。添加与Customer + new相同的字段,并通过应用程序保留它们。但在这种情况下,您必须每次都同步核心Customer对象和您的ExtCusomers数组。不是一个好方法,但可能对你的解决方案没问题

答案 1 :(得分:0)

BTDT我不建议这样做。

当您编辑模型并要求xcode生成类文件时,xcode将覆盖该模型类文件中的任何更改(以及任何代码扩展)。我试图通过以各种方式扩展模型类来分割模型类定义和我的模型逻辑,但结果我在应用程序的后期阶段发现了很多问题。

所以基本上你想做的是让xcode重新创建你的类文件。对模型进行更改后,您需要手动更新模型文件。只有在属性的类型或名称发生更改时,才需要更新类文件。

此过程确实需要一些规范,但比模型类的任何类别或扩展更容易维护和管理。

此外,我建议在模型类之外保留尽可能多的逻辑。将逻辑添加到模型类中以对属性值(或更改)作出反应是很诱人的。但是在评估此方法时,请考虑您的managedObject相当短暂。不要在你的应用内传递它。托管对象可能会变成故障,您的逻辑将无法再访问。

考虑将逻辑移动到一个单独的类中,而不是从NSManagedObject继承。复制特定任务所需的属性,并在该单独的类中执行所需的逻辑。那堂课不会对你有任何错误,你会对上下文有更多的自由。