Проверьте, существует ли ключ NSEntityDescription - PullRequest
4 голосов
/ 13 марта 2012

Мне нужно проверить, существует ли ключ 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];
}

Ответы [ 3 ]

12 голосов
/ 14 марта 2012

вы не должны проверять селекторы. Представьте себе ключ с именем entity или 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];
    }
}
6 голосов
/ 26 сентября 2012

Отметьте,

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

0 голосов
/ 13 марта 2012

Я думаю, вы спрашиваете, хотите ли вы проверить, реагирует ли на назначение объект недвижимости.В этом случае:

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

Эквивалентом-получателем является propertyName.Эквивалент сеттера - setPropertyName.

...