【问题标题】:Custom NSManagedObject subclass constructor自定义 NSManagedObject 子类构造函数
【发布时间】:2014-09-04 15:35:08
【问题描述】:

我有一个关于 CoreData 和 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;
    }
}

【问题讨论】:

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


    【解决方案1】:

    我认为没有必要重写 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 对象。

    【讨论】:

      【解决方案2】:

      也许它会有所帮助:对于我所有可以从 JSON 创建的 NSManagedObject 子类,我添加了一个名称为 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     
      }
      

      【讨论】:

        猜你喜欢
        • 2012-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-18
        • 2023-04-09
        • 1970-01-01
        相关资源
        最近更新 更多