根据我对Core Data的理解,原始访问器工作所需的一切是属性名称的@dynamic指令(以及在实体实现中声明该属性的原始访问器)。
出于某种原因,当使用生成的原语访问器时,setState:方法不修改state属性:
- (int)state
{
NSNumber * tmpValue;
[self willAccessValueForKey:@"state"];
tmpValue = [self primitiveState];
[self didAccessValueForKey:@"state"];
return [tmpValue intValue];
}
- (void)setState:(int)value
{
[self willChangeValueForKey:@"state"];
[self setPrimitiveState:[NSNumber numberWithInt:value]];
[self didChangeValueForKey:@"state"];
}
使用键值编码版时修改状态属性
- (int)state
{
NSNumber * tmpValue;
[self willAccessValueForKey:@"state"];
tmpValue = [self primitiveValueForKey:@"state"];
[self didAccessValueForKey:@"state"];
return [tmpValue intValue];
}
- (void)setState:(int)value
{
[self willChangeValueForKey:@"state"];
[self setPrimitiveValue:[NSNumber numberWithInt:value] forKey:@"state"];
[self didChangeValueForKey:@"state"];
}
在这两种情况下,我都将原始访问器声明如下(并根据Apple的示例和代码生成):
@interface Post (CoreDataGeneratedPrimitiveAccessors)
- (NSNumber *)primitiveState;
- (void)setPrimitiveState:(NSNumber *)value;
@end
我有点不知道为什么会这样。任何帮助将不胜感激!
答案 0 :(得分:3)
经过大量的头脑搔痒,调试,摆弄和猜测,我终于找到了问题所在:如果将这些属性定义为实例变量,则不会动态生成Core Data原始访问器。我已将它们定义为用于调试目的(因为GBD无法在没有定义的ivars的情况下看到属性的值),这样就无法正确生成原始访问器。这是Apple应该以某种形式真正记录的内容。因为很难自己发现。我希望这可以帮助那些遇到同样问题的人!
答案 1 :(得分:1)
我一直在研究这个问题,其中一个发现的事情是,与文档相反,从数据模型生成的实现文件不会列出原始动态访问器。其他地方声明你必须自己添加它们。这可能是问题吗?
答案 2 :(得分:0)
您是否正在使用/修改Xcode生成的NSManagedObject
代码?我相信默认情况下这些是由#if 0
指令“注释”生成的。
答案 3 :(得分:0)
只是想说我遇到了同样的问题,不得不根据你的评论切换到setPrimitiveValue和primitiveValueForKey。令我困扰的是默认实现不起作用。在我的例子中,值得注意的是我是另一个NSManagedObject的子类。不确定这是否也是你的情况。