NSManagedObject подклассы и setValuesForKeysWithDictionary:
Я инициализирую NSManagedObject
подкласс с использованием:
- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues
Я также сознательно даю ему неопределенные ключи, которые, конечно, должны вызывать исключение.
Итак, я реализовал:
- (void)setValue:(id)value forUndefinedKey:(NSString *)key
Если ключ не определен, я сопоставляю его с правильным ключом.
Однако моя реализация никогда не вызывается, вместо этого NSManagedObject
используется реализация, которая, в свою очередь, по- прежнему создает исключение.
Есть ли поведение (или ошибка), который мешает setValuesForKeysWithDictionary:
от использования любого NSManagedObject
Реализация подкласса setValue:forUndefinedKey:
?
Добавление кода по запросу, но так как я просто реализую существующий метод, который не вызывается, я не знаю, насколько это поможет:
В контексте:
- (Company*)companyWithDictionary:(NSDictionary*)values{
Company* newCompany = (Company*)[NSEntityDescription insertNewObjectForEntityForName:@"Company" inManagedObjectContext:self];
[newCompany setValuesForKeysWithDictionary:values];
return newCompany;
}
в Company
подкласс (никогда не вызывается):
- (void)setValue:(id)value forUndefinedKey:(NSString *)key{
if([key isEqualToString:idKey]){
[self setValue:value forKey:@"uniqueID"];
}else if([key isEqualToString:descriptionKey]){
[self setValue:value forKey:@"descriptionText"];
}else if([key isEqualToString:timeUpdatedKey]){
[self setValue:value forKey:@"dateUpdated"];
}else{
[super setValue:value forUndefinedKey:key];
}
}
3 ответа
В NSManagedObject определенно нет ничего, что мешало бы этому; Я делаю именно это в приложении, над которым я работаю. Можете ли вы опубликовать больше своего кода?
Одна мысль, также: вы уверены, что это setValue:forUndefinedKey:
это исключение? Для управляемого объекта я уверен, что вам также нужно реализовать valueForUndefinedKey:
(получатель), чтобы заставить вещи работать должным образом.
Простой вопрос, но указываете ли вы имя класса вашего подкласса NSManagedObject для сущности в вашей модели?
Кроме того, вы сказали, что инициализируете управляемый объект... как? Вы должны вставить его через +[NSEntityDescription insertNewObjectForEntityForName: inManagedObjectContext:] в большинстве случаев, если только у вас нет веских причин не делать этого.
Быстрый дамп класса платформы CoreData показывает, что NSManagedObject
также переопределяет setValuesForKeysWithDictionary:
Таким образом, похоже, что он определенно выполняет некоторые настройки для этого метода, возможно, из-за соображений производительности или чего-то в этом роде. Я, вероятно, просто напишу свой собственный метод, эквивалентный setValuesForKeysWithDictionary:
и назовите это вместо этого, чтобы избежать всего беспорядка. Что-то вроде этого:
- (void)mySetValuesForKeysWithDictionary:(NSDictionary*)dict
{
for (NSString* key in dict)
[self setValue:[dict objectForKey:key] forKey:key];
}