我使用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;
答案 0 :(得分:1)
我是使用awakeFromInsert和awakeFromFetch完成的。
来自Apple的文档:
在典型的Cocoa类中,您通常会覆盖指定的初始化程序(通常是init方法)。在NSManagedObject的子类中,有三种不同的方法可以自定义初始化 - 通过覆盖initWithEntity:insertIntoManagedObjectContext:,awakeFromInsert或awakeFromFetch。你不应该覆盖init。不鼓励您覆盖initWithEntity:insertIntoManagedObjectContext:由于此方法中所做的状态更改可能无法与undo和redo正确集成。
答案 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
是模型的名称。