4

NSEntityDescription在尝试设置值之前,我需要检查是否存在密钥。我有一个 JSON 数据字典,不想尝试设置对象中不存在的键。

Appointment *appointmentObject = [NSEntityDescription insertNewObjectForEntityForName:@"Appointments" inManagedObjectContext:[[DataManager sharedInstance] managedObjectContext]];
for (id key in dict) {
    // Check if the key exists here before setting the value so we don't error out.
        [appointmentObject setValue:[dict objectForKey:key] forKey:key];
}
4

3 回答 3

12

你不应该检查选择器。想象一个名为entityor的键managedObjectContext。NSManagedObject 类肯定会响应这些选择器,但是如果您尝试将错误分配给这些选择器,那么最好的事情就是您的代码会立即崩溃。运气差一点,这样的事情会破坏完整的核心数据文件,以及所有的用户数据。

NSEntityDescription有一个名为的方法attributesByName,它返回一个字典,其中包含您的属性名称和对应的NSAttributeDescriptions. 所以这些键基本上是你可以使用的所有属性。

像这样的东西应该工作:

Appointment *appointmentObject = [NSEntityDescription insertNewObjectForEntityForName:@"Appointments" inManagedObjectContext:[[DataManager sharedInstance] managedObjectContext]];
NSArray *availableKeys = [[appointmentObject.entity attributesByName] allKeys];
for (id key in dict) {
    if ([availableKeys containsObject:key]) {
        // Check if the key exists here before setting the value so we don't error out.
        [appointmentObject setValue:[dict objectForKey:key] forKey:key];
    }
}
于 2012-03-13T20:45:53.640 回答
6

检查这个,

BOOL hasFoo = [[myObject.entity propertiesByName] objectForKey:@"foo"] != nil;

于 2012-09-26T09:04:02.970 回答
-1

我想您是在问您是否要检查约会对象是否响应属性。在这种情况下:

if([appointmentObject respondsToSelector:NSSelectorFromString(key)])...

getter 等效项是 propertyName。setter 等效项是 setPropertyName。

于 2012-03-13T19:07:05.953 回答