2012-09-30 33 views
2

我使用核心数据并有一个对象ExerciseForRoutine。我目前手动创建它,然后设置属性,这似乎浪费了代码。有没有什么办法可以创建自定义init()方法在一行来处理这个(我知道该怎么做左右分配/ init,但是核心数据有不同的init()方法..)我可以为核心数据模型对象使用自定义初始值设定项吗?

目前代码:

ExerciseForRoutine *exerciseForRoutine = (ExerciseForRoutine *)[NSEntityDescription insertNewObjectForEntityForName:@"ExerciseForRoutine" inManagedObjectContext:managedObjectContext]; 
exerciseForRoutine.name = self.selectedExercise; 
exerciseForRoutine.timeStamp = date; 
exerciseForRoutine.muscleGroup = self.muscleName; 
exerciseForRoutine.musclePicture = self.muscleURL; 

ExerciseForRoutine类

@class Routine; 

@interface ExerciseForRoutine : NSManagedObject { 
@private 
} 
@property (nonatomic, strong) NSDate * timeStamp; 
@property (nonatomic, strong) NSString * name; 
@property (nonatomic, strong) NSString * muscleGroup; 
@property (nonatomic, strong) NSString * musclePicture; 
@property (nonatomic, strong) Routine * exerciseToRoutine; 

@end 

@implementation ExerciseForRoutine 
@dynamic timeStamp; 
@dynamic name; 
@dynamic muscleGroup; 
@dynamic musclePicture; 
@dynamic exerciseToRoutine; 
+0

你不应该重写初始化。有关信息[对象生命周期初始化和释放]的文档(https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdManagedObjects.html#//apple_ref/doc/) uid/TP40003397-SW2) –

回答

0

其Xcode创建用于处理核心数据对象的类不应该被重写,而不是你可以做的是创造出从NSObject的继承自己的自定义类,并用你的方法来处理管理反对他们的。

索尔:你可以做到这一点与参数init方法的帮助下

然后,它会是这个样子

 
CoreDataHelperClass *someobj = [[CoreDataHelperClass alloc]initWithname:@"name" andTimeStamp:@"Time" andMuscleGroup:@"musclegroup" andPicture:UIImagePNGRepresentation(someimageObj)]; 

上面做,你需要添加自己的init方法在CoreDataHelperClass类这样

CoreDataHelperClass

 

- (id)initWithName:(NSString*)name andTimeStamp:(NSString*)timeStamp andMuscleGroup:(NSString*)group andPicture:(NSData*)imageData; 

的.H部分CoreDataHelperClass的10

.M部分

 

- (id)initWithName:(NSString*)name andTimeStamp:(NSString*)timeStamp andMuscleGroup:(NSString*)group andPicture:(NSData*)imageData 
{ 

//you assignment code to the core data attributes goes here 

ExerciseForRoutine *obj = [[ExerciseForRoutine alloc]init]; 

obj.name = name; 
obj.timestamp = timeStamp; 

//and so on 

return self; 

} 


反正你也可以做的是什么传递一个字典的键值对获得您的自定义类中的值,或者您也可以传递一个NSMutableArray像什么都适合你的商业模式都将工作。

您可以在CoreDataHelperClass中获取Dictionary或Array的值,并将这些值分配给您的属性。

希望我有你查询的权利,如果没有,那么亲切更不用说通过评论

+0

您不应该覆盖被管理对象的init。文件很清楚。请编辑您的问题以适应它。 –

+0

@Flex_Addicted:我没有说明在托管对象类中的任何类型的定制,我说的是创建自己的类和管理托管对象,我觉得这是非常可行的,并且不违反任何苹果规范。 – Radix

+0

好的,抱歉...我误解了答案。干杯。 –

0

错误部分要添加到@板蓝根的答案,你应该考虑使用mogenerator,因为它会为你做多,子类业务。

http://rentzsch.github.io/mogenerator/

的指南见here来设置它,并让它在XCode中运行5

有一个小警告要提防是:如果你得到一个断言失败,上面写着:

-[MOGeneratorApp setModel:] blah blah blah 

那么你应该指向mogenerator.xcdatamodel文件.xcdatamodeld包在你的运行脚本阶段内,像这样:

mogenerator -m Model.xcdatamodeld/Model.xcdatamodel -O Project/Model --template-var arc=true 

其中Project是您的项目的名称,Model是您的模型的名称。

参见https://github.com/rentzsch/mogenerator/issues/169

1

我这样做是使用awakeFromInsert和awakeFromFetch。

从苹果公司的文档:

在一个典型的可可类,你通常重载指定初始化函数(通常init方法)。在NSManagedObject的子类中,有三种不同的方式可以自定义初始化 - 通过覆盖initWithEntity:insertIntoManagedObjectContext:,awakeFromInsert或awakeFromFetch。你不应该重写init。您不鼓励重写initWithEntity:insertIntoManagedObjectContext:因为此方法中的状态更改可能无法与撤销和重做进行正确集成。

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreData/Articles/cdManagedObjects.html

相关问题