[ios]与 CoreData,如果我有一个 @dynamic 属性,可以我重写其吸气就像它是 @synthesized 吗?(懒实例化)

发布时间: 2017/3/21 23:03:59
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

使用 CoreData 创建一个实体,然后我创建子类它入其自己的文件,在那里它有 @propertys,然后它有 @dynamic 部分.m 文件中。

当我想要某事有一定的价值,如果它永远不会被设置时,我总是用懒惰的实例化,像如下︰

- (NSString *)preview {
    if ([self.body length] < 200) {
        _preview = self.body;
    }
    else {
        _preview = [self.body substringWithRange:NSMakeRange(0, 200)];
    }

    return _preview;
}

但是我怎么做这与 @dynamic 属性呢?如果我做同样的事情,它说 _preview 是未申报的财产,但它是在.h 文件中。做什么我做不同于懒实例化它?

解决方法 1:

一个标准的方法是定义 preview 作为core data中的瞬态特性模型 (这样的值实际上不存储在数据库中),并执行自定义的 getter 方法。你的情况它会看起来像︰

- (NSString *)preview
{
    [self willAccessValueForKey:@"preview"];
    NSString *preview = [self primitiveValueForKey:@"preview"];
    [self didAccessValueForKey:@"preview"];
    if (preview == nil) {
        if ([self.body length] < 200) {
            preview = self.body;
        } else {
            preview = [self.body substringWithRange:NSMakeRange(0, 200)];
        }
        [self setPrimitiveValue:preview forKey:@"preview"];
    }
    return preview;
}

(您可以提供自定义的 getter,@dynamic 属性的 setter 方法。然而,core data属性是不只是通过备份实例变量。That is 的原因,为什么你不能访问 _preview .)

如果你需要 preview 要重新计算,如果 body 属性的更改,然后你还必须实现自定义的 setter 方法为 body ,设置 previewnil

更多的信息,请阅读"core data编程指南"中的非标持久性属性

更新︰当前版本的core data编程指南不包含这一章了。从路回机器,你可以找到某个已存档的版本。当然这必须带一粒盐,因为它不是官方的文档不再的一部分。

赞助商