我可以为核心数据模型对象使用自定义初始化程序吗?

时间:2012-09-30 01:08:12

标签: iphone objective-c cocoa-touch core-data

我使用Core Data并拥有一个对象ExerciseForRoutine。我目前正在手动创建它,然后设置它的属性,这似乎浪费代码。有什么方法可以创建一个自定义的init方法来处理这一行(我知道如何处理alloc / 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

@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;

3 个答案:

答案 0 :(得分:1)

我是使用awakeFromInsert和awakeFromFetch完成的。

来自Apple的文档:

  

在典型的Cocoa类中,您通常会覆盖指定的初始化程序(通常是init方法)。在NSManagedObject的子类中,有三种不同的方法可以自定义初始化 - 通过覆盖initWithEntity:insertIntoManagedObjectContext:,awakeFromInsert或awakeFromFetch。你不应该覆盖init。不鼓励您覆盖initWithEntity:insertIntoManagedObjectContext:由于此方法中所做的状态更改可能无法与undo和redo正确集成。

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

答案 1 :(得分:0)

不应该重写Xcode为处理核心数据对象而创建的类,而是可以创建自己的自定义类,该类继承自NSObject并编写处理托管对象的方法。

Sol:你可以借助参数化的init方法

来做到这一点

然后看起来像这样

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

要执行上述操作,您需要在CoreDataHelperClass类中添加自己的init方法,如下所示

.h CoreDataHelperClass的一部分


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

.m CoreDataHelperClass的一部分


- (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;

}


无论如何你还可以做的是传递一个字典,其中keyvalue对获取你的自定义类中的值,或者你也可以传递一个NSMutableArray,就像任何适合你的商业模式一样都可以工作。

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

希望我的查询正确,如果没有,请通过评论提及错误部分

答案 2 :(得分:0)

要添加@Rubix的答案,您应该考虑使用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