2014-09-04 71 views
0

我有一个关于CoreData和NSManagedObject的问题。自定义NSManagedObject子类的构造函数

在我的应用程序的体系结构中,我有一个REST客户端,它构建我从服务器接收的对象的实例。

例如我有这样的方法:

- (NSArray*) getAllCards:(NSDictionary*) jsonResponse; 

这需要JSON响应和返回卡的阵列。

这没关系......

现在我需要保存我的CoreData卡。

我定义了我的模型,所以我有一些NSManagedObject的子类。 例如:Card: NSManagedObject

但我想要一个简单的构造函数从JSON构造对象,然后将其传递给我的经理,他将在CoreData中添加它。

我不会通过与CoreData一些信息(如上下文..)我的客户REST ......我想有逻辑在我CoreData CoreData经理..

我如何定义我的卡的有效构造函数?

我可以用这种方式定义一个构造函数吗?

- (id) initWithName:(NSString*) name 
      cardId:(NSString*) cardId 
     type:(NSString*) type 
{ 
    self = [super initWithEntity:nil insertIntoManagedObjectContext:nil]; //This is wrong.. 
    if (self) { 
     self.name = name; 
     self.cardId = cardId; 
     self.type = type; 
    } 
} 

回答

0

我看不需要重写init方法。只需给你的CoreDataManager类提供一个方法,该方法需要字典并生成核心数据实体。

-(void)storeCardsFromJSON:(NSDictionary*)dictionary { 
    for (NSDictionary *cardInfo in dictionary[@"cardArray"]) { 
     Card *newCard = [NSEntityDescription insert...]; 
     newCard.cardID = cardInfo[@"cardID"]; 
     // etc. 
    } 
    // save 
} 

(可选)返回新创建的卡片数组。在这种方法中,您还可以过滤已存在的卡片(例如,基于cardID属性)并修改它们而不是再次插入它们。

在您的应用中,您应该只使用核心数据中的Card对象。不需要有不同类别的对象,或使用NSDictionary对象。

0

也许这将帮助:所有我的NSManagedObject子类,可以从JSON创建,我增加了一个类别中包含的MyObject + JSON的名字,我有2种方法有:

+ (instancetype)deserializeFromDictionary:(NSDictionary *)dictionary inContext:(NSManagedObjectContext *)context; 
- (void)updateFromDictionary:(NSDictionary *)dictionary; 

我用inContext的:部分是因为我通常使用整个事务的私有上下文批量插入对象。

方法是这样的:

+ (instancetype)deserializeFromDictionary:(NSDictionary *)dictionary inContext:(NSManagedObjectContext *)context; 
{ 
    if (!dictionary || ![dictionary isKindOfClass:[NSDictionary class]] || !context) { 
     return nil; 
    } 

    MyObject *anObject = (MyObject *)[NSEntityDescription insertNewObjectForEntityForName:@"MyObject" inManagedObjectContext:context]; 
    [anObject updateFromDictionary:dictionary]; 

    return anObject; 
} 

而且

- (void)updateFromDictionary:(NSDictionary *)dictionary 
{ 
    NSParameterAssert(dictionary); 
    if (!dictionary || ![dictionary isKindOfClass:[NSDictionary class]]) { 
     return; 
    } 

    self.identifier = dictionary[@"id"]; 
    self.title  = dictionary[@"title"]; //and so on  
} 
相关问题