自定义NSManagedObject子类构造函数

时间:2014-09-04 15:35:08

标签: ios objective-c json core-data nsmanagedobject

我对CoreData和NSManagedObject有疑问。

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

例如我有这个方法:

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

接受JSON响应并返回一组Cards。

没关系......

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

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

但我希望有一个简单的构造函数来从JSON构造对象,然后将其传递给我的经理,他将把它添加到CoreData中。

我不会将与CoreData相关的一些信息(例如Context ..)传递给我的客户端REST ...我想在我的CoreData CoreData Manager中使用逻辑。

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

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

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

2 个答案:

答案 0 :(得分:0)

我认为没有必要覆盖init方法。只需为您的CoreDataManager类提供一个获取字典并生成核心数据实体的方法。

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

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

在您的应用中,您应该只使用Core Data中的Card个对象。不需要使用不同类别的对象,也不需要使用NSDictionary个对象。

答案 1 :(得分:0)

也许它会有所帮助:对于我可以从JSON创建的所有NSManagedObject子类,我添加了一个名为MyObject + JSON的类别,我有两种方法:

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

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

方法如下:

+ (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     
}