2

我使用 Core Data 并有一个 object 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;

例行练习课

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

3 回答 3

1

我使用 awakeFromInsert 和 awakeFromFetch 做到了这一点。

来自 Apple 的文档:

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

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

于 2015-03-26T13:57:55.630 回答
0

要添加到@Radix 的答案,您应该考虑使用mogenerator,因为它会为您完成大部分子类化业务。

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

有关设置它并让它在 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

于 2014-03-25T14:39:50.440 回答
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
{

//您将代码分配给核心数据属性在此处

锻炼例程 *obj = [[锻炼例程分配]init];

obj.name = 名称;
obj.timestamp = 时间戳;

//等等

回归自我;

}


无论如何,您还可以做的是传递带有键值对的字典,获取自定义类中的值,或者您也可以传递一个 NSMutableArray,就像适合您的业务模型的那样,两者都可以工作。

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

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

于 2012-09-30T03:42:59.247 回答