核心数据和瞬态属性

时间:2011-01-28 07:47:51

标签: core-data transient

我在Core Data中设置瞬态属性时遇到问题。我试图解决的问题是:我有一组使用Core Data成功存储的对象。此集合本质上是一个只读集合,但在运行时,我想将另一个对象(在本例中为UIImage)与集合中的每个项目相关联。我不需要存储UIImages;它纯粹是一个运行时关联。所以我真正需要的是集合中每个对象的“占位符”,我可以在以后删除UIImage。

瞬态属性似乎是正确的,为此,Core Data参考文档告诉我,我应该在数据模型中设置一个“undefined类型的可选,瞬态属性”,我已经完成了: XCode snippet

此外,它告诉我,我不需要在实现对象中定义相应的属性,但我必须编写自定义访问器和放大器。二传手术方法。我根据文档中的示例对这些方法建模如下:

- (void)setDisplayImage:(UIImage *)anImage {

    [self willChangeValueForKey:@"displayImage"];
    [self setPrimitiveValue:anImage forKey:@"displayImage"];
    [self didChangeValueForKey:@"displayImage"];
}

- (UIImage *)displayImage {

    [self willAccessValueForKey:@"displayImage"];
    UIImage *anImage = [self primitiveDisplayImage];
    [self didAccessValueForKey:@"displayImage"];

    if (anImage == nil) {       
        NSData *displayImageData = [self displayImageData];
        if (displayImageData != nil) {
            anImage = [NSKeyedUnarchiver unarchiveObjectWithData:displayImageData];
            [self setPrimitiveDisplayImage:anImage];
        }
    }
    return anImage;
}

还有一个延迟的“写”方法(willSave),我已经为严格的完整性而写了,尽管如上所述,我永远不会把这些对象写回存储。

我得到的问题是 - (UIImage *)displayImage {的primitiveDisplayImage和setPrimitiveDisplayImage方法。基本上,编译器会对这两个方法发出警告,因为“对象X可能无法响应'primitiveDisplayImage'..”等。 但是,我对文档的理解是这些原始访问器/设置器是自动创建的 - 这似乎并非如此。 有谁可以帮我解决这个问题? 非常感谢

2 个答案:

答案 0 :(得分:5)

setPrimitive...方法的问题在于虽然NSManagedObject将在运行时响应它们,但编译器无法知道它们是否存在。您可以通过使用类别声明实体类的头文件中的方法来抑制警告消息,以便编译器不会因为您未在实现中定义它而对您大喊大叫。

另一种选择就是为您需要访问的每个属性调用[self setPrimitiveValue:value forKey:@"key"];。我过去曾经使用过这种方法,虽然我在文档中注意到10.5和之后不鼓励这样做。

答案 1 :(得分:3)

在这里找到答案:Managed Object Accessor Methods

基本上:在类别头文件中声明@propery,在类别实现文件中定义@dynamic