【问题标题】:Assigning Web Service response data to NSManagedObject subclass将 Web 服务响应数据分配给 NSManagedObject 子类
【发布时间】:2015-03-04 05:07:32
【问题描述】:

目前我正在对CoreData Entity的所有属性进行一一赋值,如下所示;

employee.first_name = [responseDict valueForKey:@"first_name"];
employee.last_name = [responseDict valueForKey:@"last_name"];
employee.middle_name = [responseDict valueForKey:@"middle_name"];

// And So On... for say, like 100+ more attributes.

问题:即将引入许多实体,我想避免这些手动分配。

问题:有没有更聪明的方法可以做到这一点?

希望我能说清楚。如果需要任何信息,请告诉我。

【问题讨论】:

  • 您应该在Employee 类中添加一个自定义的initWithDictionary 方法,但基本上,它必须使用相同的逻辑。
  • 您的问题是有许多不同的实体(Employee、Department 等),或许多不同的属性(firstName、middleName 等),或许多不同的对象(即 Employee 类的实例)?还是三者的结合?
  • 问题是,我想避免对所有属性进行这些分配。就像一些逻辑一样,只需要一个语句就可以插入所有的键和值。希望我说得通,在这里。

标签: ios core-data nsdictionary nsmanagedobject key-value


【解决方案1】:

如果您确定传入的字典键全部存在于您的托管对象实体上,您可以使用setValuesForKeysWithDictionary:一步完成分配 p>

[employee setValuesForKeysWithDictionary:responseDict];

但我的意思是要确定。这将为在responseDict 中找到的每个键在employee 上调用setValue:forKey:。如果responseDict 包含employee 无法识别的任何键,您将收到一个异常,指出employee 不符合键的键值编码。

如果您不确定,一种安全的方法是为employee 创建一个NSManagedObject 子类,并让该子类声明它希望从Web 服务接收的属性名称列表。例如,如果 Employee 类有一个看起来像这样的 NSArray

self.webServicePropertyNames = @[ @"first_name", @"last_name", @"middle_name"];

...然后您可以遍历该数组并使用setValue:forKey 分配每个值,但使用通用代码。

除此之外,您还可以使用 Objective-C 运行时在 employee 上查找属性名称,然后在 responseDict 中找到它们。这将或多或少地像setValuesForKeysWithDictionary: 一样工作,除非没有尝试分配不存在的键值的危险。这不是微不足道的,而是I wrote up a blog post describing the process a while ago

【讨论】:

  • 阅读您的博文。似乎很有希望的解决方案。 +1
【解决方案2】:

我曾经遇到过这样一个案例:大约 35 个实体和数百个属性要移植到一个新的 Web API。我所做的如下:

首先,我创建了将 Web API 实体和属性名称与我的 Core Data 匹配的映射字典(作为 plist)。这通常是必要的,因为 Web API 有时会使用诸如 "id""description" 之类的名称,它们是 Core Data 中的保留字。

如果没有必要的数据类型验证,您现在可以像这样使用 KVC 来分配属性。

for (NSString *key in responseDictionary.allKeys) {
   NSString *entityKey = mappingDictionary[key];
   [entityInstance setValue:responseDictionary[key] forKey:entityKey];
}

如果你想比较数据类型,它会变得有点复杂。查看对您有帮助的 NSAttributeDescription API。它继承自NSPropertyDescription,其中包括name 属性(相当于上面的entityKey)。您可以通过快速枚举从NSEntityDescriptionattributesByName 或所有属性(包括关系)中获取所有属性:

NSEntityDescription *anEntity = ...;
for (NSPropertyDescription *property in anEntity) {
    // property is each instance of NSPropertyDescription in anEntity in turn
}

【讨论】:

  • 我在那里进行了数据类型验证,正在研究NSAttributeDescription API。谢谢+1
猜你喜欢
  • 2019-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
  • 2019-04-15
  • 1970-01-01
相关资源
最近更新 更多