我正在使用:
初始化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];
}
}
答案 0 :(得分:3)
NSManagedObject肯定没有什么可以阻止这种情况;我在我正在开发的应用程序中正是这样做的。你能发布更多的代码吗?
还有一个想法:你确定它是setValue:forUndefinedKey:
抛出异常吗?对于托管对象,我非常确定您还需要实现valueForUndefinedKey:
(getter)才能使事情正常工作。
答案 1 :(得分:2)
简单的问题,但是您是否为模型中的实体指定了NSManagedObject子类的类名?
另外,你说你正在初始化托管对象......怎么样?在大多数情况下,你应该通过+ [NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:]插入它,除非你有充分的理由不这样做。
答案 2 :(得分:1)
CoreData框架的快速类转储表明NSManagedObject
也会覆盖setValuesForKeysWithDictionary:
,所以它看起来肯定是在为该方法做一些自定义,可能是出于性能原因或类似的原因。我可能只是编写自己的方法等效于setValuesForKeysWithDictionary:
并调用它来避免整个混乱。像这样:
- (void)mySetValuesForKeysWithDictionary:(NSDictionary*)dict
{
for (NSString* key in dict)
[self setValue:[dict objectForKey:key] forKey:key];
}