Ios 子类NSManagedObject可轻松初始化

Ios 子类NSManagedObject可轻松初始化,ios,core-data,nsmanagedobject,Ios,Core Data,Nsmanagedobject,对于来自服务器API的模型,我使用如下构造函数: @implementation MenuAPIModel -(instancetype)initWithServerData:(id)data{ self = [super initWithServerData:data]; return self; } -(void)performMapping{ _basketId = self.serverData[@"basket_id"]; _orderId =

对于来自服务器API的模型,我使用如下构造函数:

@implementation MenuAPIModel

-(instancetype)initWithServerData:(id)data{

    self = [super initWithServerData:data];
    return self;
}

-(void)performMapping{

    _basketId = self.serverData[@"basket_id"];
    _orderId = self.serverData[@"order_id"];
    _itemId = self.serverData[@"id"];
    _name = self.serverData[@"name"] == [NSNull null] ? @"" : self.serverData[@"persons"];
    _payedFrom = [self.dfDetail dateFromString:self.serverData[@"payed_from"]] == nil ? [self.dfBasic dateFromString:self.serverData[@"payed_from"]] : [self.dfDetail dateFromString:self.serverData[@"payed_from"]];
    _payedTill = [self.dfBasic dateFromString:self.serverData[@"payed_till"]] == nil ? [self.dfBasic dateFromString:self.serverData[@"payed_till"]] : [self.dfDetail dateFromString:self.serverData[@"payed_till"]];
    _persons = self.serverData[@"persons"] == [NSNull null] ? @"2-3" : self.serverData[@"persons"];
    _price = self.serverData[@"price"] == [NSNull null] ? @(0) : self.serverData[@"price"];
    _price3 = self.serverData[@"price3"] == [NSNull null] ? @(0) : self.serverData[@"price3"];
    _price12 = self.serverData[@"price12"] == [NSNull null] ? @(0) : self.serverData[@"price12"];
    _status = self.serverData[@"status"] == [NSNull null] ? @"not_payed" : self.serverData[@"persons"];
}
因此,我可以创建对象,只需编写:
[MenuAPIModel initWithServerData:data]


现在我将NSManagedObject子类化,想知道如何将XCode为我创建的这4个文件子类化,以使构造函数与上面的一样?

您可以创建一种助手,它可以有以下实现(这只是一个示例,所以我使用了Swift):


我希望它足够接近您需要的东西。

您可以创建一种助手,它可以有以下实现(这只是一个示例,所以我使用了Swift):


我希望它与您需要的足够接近。

我不完全理解您想要子类化什么,但是为了使用
CoreData
,您的模型必须子类化
NSManagedObject
,因此如果您想子类化您编写的自定义模型类,该类必须子类化
NSManagedObject

现在,
NSManagedObject
的新XCode模板为您在
xcdatamodel
中声明的每个模型创建了一个类和一个类别。你会得到这样的东西

MenuAPIModel+CoreDataProperties.h

@interface MenuAPIModel (CoreDataProperties) {
}
@property(nonatomic, strong) NSNumber *basketId
.....other properties that you have
@end
@interface MenuAPIModel : NSManagedObject
+(instancetype)initWithServerData:(id)serverData;
@end
MenuAPIModel+CoreDataProperties.m

@implementation MenuAPIModel (CoreDataProperties)
@dynamic basketId
@dynamic ....other properties ...
@end
@implementation MenuAPIModel

 +(instancetype)initWithServerData:(id)serverData {
     NSManagedObjectContext *context = ...get the current context...
     MenuAPIModel *model = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([MenuAPIModel class])inManagedObjectContext:context];
     model.basketId = serverData[@"basket_id"];
     ...other parsing....
     return model;
 }
MenuAPIModel.h

@interface MenuAPIModel (CoreDataProperties) {
}
@property(nonatomic, strong) NSNumber *basketId
.....other properties that you have
@end
@interface MenuAPIModel : NSManagedObject
+(instancetype)initWithServerData:(id)serverData;
@end
MenuAPIModel.m

@implementation MenuAPIModel (CoreDataProperties)
@dynamic basketId
@dynamic ....other properties ...
@end
@implementation MenuAPIModel

 +(instancetype)initWithServerData:(id)serverData {
     NSManagedObjectContext *context = ...get the current context...
     MenuAPIModel *model = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([MenuAPIModel class])inManagedObjectContext:context];
     model.basketId = serverData[@"basket_id"];
     ...other parsing....
     return model;
 }

如您所见,您可以通过添加一个额外的方法来使用默认情况下由XCode创建的类和类别。只是提醒一下,
NSManagedObject
无法使用
alloc]init]创建,它必须使用
NSManagedObjectContext

创建,我不完全理解您想要子类化什么,但是为了使用
CoreData
您的模型必须子类化
NSManagedObject
,因此如果您想要子类化您编写的自定义模型类,该类必须子类
NSManagedObject

现在,
NSManagedObject
的新XCode模板为您在
xcdatamodel
中声明的每个模型创建了一个类和一个类别。你会得到这样的东西

MenuAPIModel+CoreDataProperties.h

@interface MenuAPIModel (CoreDataProperties) {
}
@property(nonatomic, strong) NSNumber *basketId
.....other properties that you have
@end
@interface MenuAPIModel : NSManagedObject
+(instancetype)initWithServerData:(id)serverData;
@end
MenuAPIModel+CoreDataProperties.m

@implementation MenuAPIModel (CoreDataProperties)
@dynamic basketId
@dynamic ....other properties ...
@end
@implementation MenuAPIModel

 +(instancetype)initWithServerData:(id)serverData {
     NSManagedObjectContext *context = ...get the current context...
     MenuAPIModel *model = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([MenuAPIModel class])inManagedObjectContext:context];
     model.basketId = serverData[@"basket_id"];
     ...other parsing....
     return model;
 }
MenuAPIModel.h

@interface MenuAPIModel (CoreDataProperties) {
}
@property(nonatomic, strong) NSNumber *basketId
.....other properties that you have
@end
@interface MenuAPIModel : NSManagedObject
+(instancetype)initWithServerData:(id)serverData;
@end
MenuAPIModel.m

@implementation MenuAPIModel (CoreDataProperties)
@dynamic basketId
@dynamic ....other properties ...
@end
@implementation MenuAPIModel

 +(instancetype)initWithServerData:(id)serverData {
     NSManagedObjectContext *context = ...get the current context...
     MenuAPIModel *model = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([MenuAPIModel class])inManagedObjectContext:context];
     model.basketId = serverData[@"basket_id"];
     ...other parsing....
     return model;
 }

如您所见,您可以通过添加一个额外的方法来使用默认情况下由XCode创建的类和类别。只是提醒一下,
NSManagedObject
无法使用
alloc]init]创建,它必须使用
NSManagedObjectContext

创建。我知道,您将所有逻辑都放在API模型中。但我想做相反的事情——基于完成的API模型类创建和填充核心数据模型。例如,如何创建类似[model initWithData:MenuapiModel instance]@EvgeniyKleban您可以根据需要填充核心数据模型,重要的部分是如何初始化代码数据模型(就像我所做的那样)。我明白了,您将所有逻辑都放在API模型中。但我想做相反的事情——基于完成的API模型类创建和填充核心数据模型。例如,如何创建类似[model initWithData:MenuapiModel instance]@EvgeniyKleban您可以根据需要填充核心数据模型,重要的部分是如何初始化代码数据模型(就像我所做的那样)。