NSManagedObject子类和setValuesForKeysWithDictionary:

7

我正在使用以下方式初始化一个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个回答

3

NSManagedObject本身并没有任何阻止这样做的内在因素;我正在我所工作的应用程序中完全这样做。你能发布更多你的代码吗?

还有一个想法:你确定是setValue:forUndefinedKey:引发了异常吗?对于托管对象,我相信你还需要实现valueForUndefinedKey:(getter)才能使事情正常运行。


是的,我在堆栈跟踪中看到了它。而且它绝对是NSManagedObject的实现。 - Corey Floyd
我还没有实现valueForUndefinedKey:。我会尝试一下,但我不明白为什么这会使setter出错。 - Corey Floyd
我记得几天前我在处理这个东西时,NSManagedObject 的某些实现似乎试图在设置新值之前检查属性的当前值,并在未定义的 getter 中失败。一旦我实现了它,就如预期地到达了未定义的 setter。 - Sixten Otto
你说得对,需要实现getter方法。仍然遇到问题,但可能与此无关。另外,在尝试你的解决方案之前,我自己实现了setValuesForKeysWithDictionary:方法,也可以正常工作。但因为我是个受虐狂,所以想要用这种方式让它工作! - Corey Floyd

2

问题很简单,但是你是否在模型中为NSManagedObject子类指定了实体的类名?

另外,你说你正在初始化托管对象...如何初始化?在大多数情况下,您应该通过+ [NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:]进行插入,除非您有充分的理由不这样做。


是的,我也是这么做的。我还重新创建了我的模型类以确保它们正确。我还尝试在模型类中实现valueForUndefinedKey方法和作为一个分类。 - Corey Floyd
这确实很奇怪。你能在一个简化的测试用例中重现这个问题吗?我做过类似的事情,但从未遇到过这个问题。 - Joshua Nozzi

1
快速对CoreData框架进行类转储表明,NSManagedObject也重写了setValuesForKeysWithDictionary:,因此看起来它肯定是在为该方法进行一些自定义,可能是出于性能原因或类似的原因。我可能会编写自己的等效于setValuesForKeysWithDictionary:的方法,并调用它来避免整个混乱。就像这样:
- (void)mySetValuesForKeysWithDictionary:(NSDictionary*)dict
{
    for (NSString* key in dict)
        [self setValue:[dict objectForKey:key] forKey:key];
}

这基本上就是我所做的,但要考虑到NSNull值。即使实施了Sixten的解决方案,仍然存在一些其他奇怪的错误,所以我已经放弃了。 - Corey Floyd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接