core-data - 核心数据和 transient 属性

标签 core-data transient

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

transient 属性似乎是正确的,为此,Core Data 引用文档告诉我应该在我已经完成的数据模型中设置“未定义类型的可选 transient 属性”:
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'..”等。
但是,我对文档的理解是,这些原始访问器/ setter 是自动创建的 - 情况似乎并非如此。
有谁能帮我解决这个问题吗?
非常感谢

最佳答案

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

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

关于core-data - 核心数据和 transient 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4825986/

相关文章:

ios - 对 Transformable 属性采用 NSSecureUnarchiveFromDataTransformer 时发生崩溃

ios - 如何使 NSManagedObject 不出错?

python-3.x - pyodbc Azure 瞬时错误

java - 如何在 Android 中将 transient 字段写入文件?

ios - 减少日期核心分配的内存消耗

ios - 仅适用于特别构建和较旧的设备,保存时核心数据崩溃

ios - 核心数据, "sorting by transient property"解决方法

javascript - 在 "CSS3 transient animation"的处理过程中能否得到 transient 值

ios - 休息套件 0.20 : can not pass in an NSManagedObject to the getObject: method

php - 何时使用 transient ,何时不使用?