2011-01-28 77 views
5

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

瞬态特性似乎是正确的事情,为此,核心数据参考文档告诉我,我应该建立在数据模型中的“undefined类型可选,瞬态属性”,我已经做了: XCode snippet

此外,它告诉我,我不需要在实现对象中定义相应的属性,但是我将不得不编写自定义访问器或setter方法。

- (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'..”等。 但是,我从文档中了解到,这些原始访问器/设置器是自动创建的 - 这似乎不是是这样的。 谁能帮我解决这个问题? 非常感谢

回答

5

setPrimitive...方法的问题是,虽然NSManagedObject将在运行时对它们作出响应,但编译器无法知道它们存在。您可以通过在实体类的头文件中声明方法来压制警告消息,使用一个类别,这样编译器就不会因为没有在实现中定义它而大叫你。

另一种选择是对每个需要访问的属性调用[self setPrimitiveValue:value forKey:@"key"];。过去我使用过这种方法,不过我刚刚在文档中注意到,在10.5和更高版本中,这是不鼓励的。