2

对于 NSKeyValueCoding 可以处理的结构类型的属性,我使用此处Apple 文档中描述的核心数据访问器模式。

例如,可以在 Core Data 模型中将 NSRange 结构指定为 Transformable 类型,然后可以通过在以下形式的 NSManagedObject 子类中提供访问器来避免客户端的 NSValue 繁琐:

界面:

@property(assign, nonatomic) NSRange range;

执行;

- (NSRange) range {

    [self willAccessValueForKey:@"range"];
    NSRange retVal = range;
    [self didAccessValueForKey:@"range"];

    return retVal;
}

- (void)setRange:(NSRange)aRange {

    [self willChangeValueForKey:@"range"];
    range = aRange;
    [self didChangeValueForKey:@"range"];
}

然而,Mogenerator 生成的 NSManagedObject 子类将 Transformable 属性声明为 NSObject 属性,因此客户端需要获取/设置 NSValues。

使用 mogenerator 处理这种情况的最佳方法是什么,同时 (1) 保持简单的 Transformable 模式而不是弄乱瞬态支持属性,以及 (2) 避免对 Mogenerator 的“机器”类进行任何编辑?

4

5 回答 5

1

正如 scc 在先前接受的答案中所建议的那样,解决此问题的最终方法是更改​​ mogenerator 模板文件。他们需要 (a) 将可转换属性的访问器更改为适当的类型(在本例中为 NSRange),然后 (b) 使用适当的 KVO 方法调用添加访问器。

由于我现在没有时间弄清楚该怎么做,所以我的临时权宜之计如下:

  • 将 attributeValueClassName 键添加到属性的 userInfo 字典(在核心数据编辑器中),其值为 NSValue(只是为了确保生成器的访问器将是 NSValue 而不是 NSObject)。
  • 在人工可编辑的 mogenerator 输出中,添加与问题中类似的访问器,但使用新名称(例如 rangeValue 和 setRangeValue)。基础值仍然是持久化的 NSValue,但我的访问器负责 KVO 和装箱/拆箱。

不理想,但我确实获得了强类型访问器,而无需编辑 mogenerator 机器文件。

于 2012-03-07T10:40:09.483 回答
0

对于那些愿意编辑机器模板文件的人,请对可转换的 NSRange 属性使用以下条件到特殊情况。

<$if Attribute.hasTransformableAttributeType && Attribute.objectAttributeClassName == "NSRange" $>

这是我更改机器模板头文件的方法。https://gist.github.com/2414047

于 2012-04-18T14:50:29.740 回答
0

您正在阅读文档的错误部分。请看这里

NSRange不需要改造。所有这些基本结构都有一些方法,例如:

NSRangeFromString();
NSStringFromRange();

因此,您可以将 shadow 属性定义为类似于 " rangeAsString" 的类型NSString

在您的 MO 子类中,您将在文档中关注如何正确转换和存储值,以便核心数据知道您的对象在执行以下操作时变脏:

myObject.range = NSMakeRange(0,5);
于 2012-06-08T03:05:57.037 回答
0

你能改变 mogenerator 使用的模板文件吗?(我认为)只要您远离标量值,您就可以安全地NSObject *使用id.

于 2012-02-27T13:41:53.297 回答
0

只需在模型对象生成器完成其工作后将类型更改为NSObject您需要的任何类型。之后你不应该有任何编译器警告。

顺便说一句,当我在定义可转换属性后运行托管对象模型生成器时,我没有得到NSObject但是id. 没有警告。

于 2012-02-16T06:58:17.773 回答