如何使用mogenerator的类型安全的结构类型Core Data属性?

时间:2012-02-16 02:10:38

标签: ios core-data mogenerator

对于NSKeyValueCoding可以处理的结构类型的属性,我使用Apple的文档here中描述的Core Data访问器模式。

例如,可以在Core Data模型中指定NSRange结构,类型为Transformable,然后通过在表单的NSManagedObject子类中提供访问器,可以避免客户端的NSValue rigmarole:

接口

@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的“机器”类进行任何编辑?

5 个答案:

答案 0 :(得分:1)

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

由于我现在有时间想弄明白该怎么做,我的临时权宜之计如下:

  • 将attributeValueClassName键添加到属性的userInfo dict(在Core Data编辑器中),其值为NSValue(只是为了确保生成器的访问器将是NSValue而不是NSObject)。
  • 在人类可编辑的生成器输出中,添加类似问题的访问器,除了新名称(例如rangeValue和setRangeValue)。基础值仍然是持久的NSValues,但我的访问者负责KVO和装箱/拆箱。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您可以更改mogenerator使用的模板文件吗? (我认为)如果您远离标量值,则可以安全地使用NSObject *代替id

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

您正在阅读文档的错误部分。请查看here

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

NSRangeFromString();
NSStringFromRange();

因此,您可以将shadow属性定义为rangeAsString类型的“NSString”。

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

myObject.range = NSMakeRange(0,5);