如何最好地将NSManagedObject子类化以提供一组核心方法

时间:2015-05-22 19:20:58

标签: ios objective-c xcode core-data refactoring

我正在研究一个实现Core Data模型的典型IOS应用程序,我正在使用XCode为模型中的每个实体生成NSManagedObjects的基本集。

典型的例子,这里没什么特别的:

//
//  ContactKey.h

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@class ContactAttribute;

@interface ContactKey : NSManagedObject

@property (nonatomic, retain) NSString * id;
@property (nonatomic, retain) NSString * keyDescription;
@property (nonatomic, retain) NSString * keyName;
@property (nonatomic, retain) NSSet *rContactAttribute;
@end

@interface ContactKey (CoreDataGeneratedAccessors)

- (void)addRContactAttributeObject:(ContactAttribute *)value;
- (void)removeRContactAttributeObject:(ContactAttribute *)value;
- (void)addRContactAttribute:(NSSet *)values;
- (void)removeRContactAttribute:(NSSet *)values;

@end

我创建了一个“知道”的数据模型管理类。应用正在使用的托管实体。其标题的片段如下所示:

#pragma mark Action

- (Annotation *) newAnnotation;
- (BOOL) addAnnotation:(Annotation *)newAnnotation;
- (BOOL) deleteAnnotation:(Annotation *)entry;
- (NSArray *) findAnnotations:(Annotation *)withMatchCriteria;
- (NSArray *) findAnnotations;
- (void) dumpAnnotations;

#pragma mark Appointment

- (Appointment *) newAppointment;
- (BOOL) addAppointment:(Appointment *)newAppointment;
- (BOOL) deleteAppointment:(Appointment *)entry;
- (NSArray *) findAppointments:(Appointment *)withMatchCriteria;
- (NSArray *) findAppointments;
- (void) dumpAppointments;

除了导致大量重复之外,它还不适合对象设计。我意识到我需要将每个实体作为自己的对象来解决。

如果我是手动执行此操作,我将创建一个NSManagedObject的子类来实现我的核心方法,然后为每个实体创建子类,以便我可以添加我想要的实体特定方法。

如您所知,每次修改模型并重新生成托管实体时,XCode都会覆盖文件,因此这不是一个可行的解决方案。

将此代码重构为单个托管实体的最佳方法是什么,仍允许XCode根据需要重新生成实体定义?

1 个答案:

答案 0 :(得分:1)

该技术是通过子类化将域/语义模型与核心数据对象图和存储完全分离。超类处理你的CoreData东西,重要或有趣的域方法被添加到子类......但听起来你已经知道了这一切!有一些工具可以帮助你。

mogeneratorgithub repo)可用于管理此过程。对于一次性,简短的设置,它集成到您​​的构建,检测模型的添加和更改,并为您生成所有支持模型(例如,动物模型产生_Animal自动生成的支持类与核心数据助手和诸如此类)和如果它还没有存在,它将为子类生成一个存根文件(例如,Animal模型产生Animal类)。然后,将源控件配置为忽略后备文件,并提交子类/ domain-ish类。

坦率地说,我喜欢发电机。重写所有这些默认访问者和助手对我来说既不好玩也不感兴趣。