0

根据我对 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"];
}

在这两种情况下,I 原始访问器都声明如下(并根据 Apple 的示例和代码生成):

@interface Post (CoreDataGeneratedPrimitiveAccessors)

- (NSNumber *)primitiveState;
- (void)setPrimitiveState:(NSNumber *)value;

@end

我有点不知道为什么会这样。任何帮助将不胜感激!

4

4 回答 4

3

经过大量的摸索、调试、摆弄和猜测和检查,我终于弄清楚了问题所在:如果将这些属性定义为实例变量,Core Data 原始访问器不会动态生成。我为调试目的定义了它们(因为 GBD 似乎无法在没有定义 ivars 的情况下看到属性的值),这阻止了原始访问器的正确生成。这是苹果应该以某种形式真正记录下来的东西。因为一个人很难发现。我希望这可以帮助其他遇到同样问题的人!

于 2011-01-21T04:25:00.750 回答
1

I've been looking into this and one of the things discovered is that, contrary to docs, the implementation file generated from the data model does NOT list the primitive dynamic accessors. Other places state that you have to add them yourself. Could that be the issue?

于 2011-02-01T23:38:58.377 回答
0

您是否正在使用/修改NSManagedObjectXcode 生成的代码?我相信默认情况下,这些是由#if 0指令“注释”生成的。

于 2010-12-20T10:53:38.910 回答
0

只是想说我遇到了同样的问题,不得不根据您在此处的评论切换到 setPrimitiveValue 和 originalValueForKey 。默认实现不起作用,这让我很困扰。在我的例子中值得注意的是,我正在继承另一个 NSManagedObject。不确定这是否也是你的情况。

于 2011-01-13T17:56:14.127 回答