如何最好地子类化 NSManagedObject 以提供一组核心方法
How best to subclass NSManagedObject to provide a set of core methods
我正在开发一个实现核心数据模型的典型 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
我创建了一个数据模型管理 class,'knows about' 应用正在使用的托管实体。它的 header 片段如下所示:
#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;
除了这会导致大量重复之外,object 设计也不合适。我意识到我需要将每个实体作为自己的 object.
如果我手动执行此操作,我会创建一个 NSManagedObject 的子class 来实现我的核心方法,然后为每个实体创建子class 这样我就可以添加实体特定的方法我要。
如您所知,每次修改模型并重新生成托管实体时 XCode 都会覆盖文件,因此这不是一个可行的解决方案。
将此代码重构为仍允许 XCode 根据需要重新生成实体定义的单个托管实体的最佳方法是什么?
该技术是通过子classing 将domain/semantic 模型与Core Data 对象图和存储完全分离。 superclass 处理你的 CoreData 东西,重要的或有趣的领域方法被添加到 subclass ......但听起来你已经知道了所有这些!有一些工具可以帮助您。
mogenerator (github repo) 可用于管理此过程。对于一次性的、简短的设置,它集成到您的构建中,检测模型的添加和更改,并为您生成所有支持模型(例如,动物模型产生 _Animal auto generated backing class with Core Data helpers 和whatnot),如果它还不存在,它将为 subclass 生成一个存根文件(例如,动物模型产生 Animal class)。然后,您将源代码管理配置为忽略支持文件,并提交 subclasses / domain-ish classes.
坦率地说,我喜欢 mogenerator。重写所有这些默认访问器和助手对我来说既不有趣也不有趣。
我正在开发一个实现核心数据模型的典型 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
我创建了一个数据模型管理 class,'knows about' 应用正在使用的托管实体。它的 header 片段如下所示:
#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;
除了这会导致大量重复之外,object 设计也不合适。我意识到我需要将每个实体作为自己的 object.
如果我手动执行此操作,我会创建一个 NSManagedObject 的子class 来实现我的核心方法,然后为每个实体创建子class 这样我就可以添加实体特定的方法我要。
如您所知,每次修改模型并重新生成托管实体时 XCode 都会覆盖文件,因此这不是一个可行的解决方案。
将此代码重构为仍允许 XCode 根据需要重新生成实体定义的单个托管实体的最佳方法是什么?
该技术是通过子classing 将domain/semantic 模型与Core Data 对象图和存储完全分离。 superclass 处理你的 CoreData 东西,重要的或有趣的领域方法被添加到 subclass ......但听起来你已经知道了所有这些!有一些工具可以帮助您。
mogenerator (github repo) 可用于管理此过程。对于一次性的、简短的设置,它集成到您的构建中,检测模型的添加和更改,并为您生成所有支持模型(例如,动物模型产生 _Animal auto generated backing class with Core Data helpers 和whatnot),如果它还不存在,它将为 subclass 生成一个存根文件(例如,动物模型产生 Animal class)。然后,您将源代码管理配置为忽略支持文件,并提交 subclasses / domain-ish classes.
坦率地说,我喜欢 mogenerator。重写所有这些默认访问器和助手对我来说既不有趣也不有趣。