2012-02-16 32 views
2

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

接口:

例如,NSRange结构可以在核心数据模型类型可变形的,那么可避免客户端的NSValue繁琐程序通过以下形式的NSManagedObject子类提供存取指定:

@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子类,然而,声明变形的属性作为NSObject的属性,因此客户需要的get/set NSValues。 (1)保持简单的可变形模式,而不是混淆瞬态后备属性,(2)避免Mogenerator的“机器”类的任何编辑?

回答

1

处理这个问题的最终方法是,如先前接受的答案中的scc所示,更改mogenerator模板文件。他们需要(a)将可变形属性的访问器更改为适当类型(本例中为NSRange),然后(b)将访问器添加适当的KVO方法调用。

因为这是比我有时间,现在要弄清楚该怎么办,我的权宜之举如下:

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

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

0

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

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

+0

我能做到这一点,但我想避免编辑mogenerator的机器.h文件。 – Cris 2012-02-16 07:36:41

+0

关于NSObject与id事物 - 不同的mogenerator版本,也许?我的1.24 – Cris 2012-02-16 07:37:31

0

你可以改变mogenerator使用的模板文件吗? (我认为),如果您远离标量值,则可以安全使用NSObject *而不是id

+0

当然这是处理它的方法。我(没有)在想什么?我将看看模板格式,并在解决方案的后面发布一些注释。 – Cris 2012-02-27 22:17:56

0

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

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

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

0

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

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

NSRangeFromString(); 
NSStringFromRange(); 

所以,你会定义阴影属性,就像这样NSString型“rangeAsString”。

在你莫子类,你会遵循关于如何正确转换和存储的值,使核心数据知道做这样当你的对象成为脏文档:

myObject.range = NSMakeRange(0,5); 
+0

使用NSValue的NSKeyValueCoding实现比使用阴影属性更简单。这些方法之间可能存在其他折衷,但我不知道它们会是什么。 – Cris 2012-06-08 03:22:37

+0

我愿意更正。核心数据当然是一个庞大而令人困惑的框架,我并不是100%精通所有扩展它的方法。你是说你的上面的代码实际上会与撤消管理联系在一起,还是你只发布了一半的解决方案?你也有primitiveRange和setPrimitiveRange:? – 2012-06-08 05:18:39

+0

我没有使用撤消管理,但AFAI明白,撤消的所有上下文需求都是属性访问触发KVO通知(上面的代码会这样做)。我还没有实现或调用原始访问器,坦率地说,在这种情况下,管理对象访问器与伊娃之间的关系并不明确。但是它是核心数据指南中为NSRange属性推荐的模式(参见本节末尾部分)(https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdAccessorMethods。 HTML#// apple_ref/DOC/UID/TP40002154-SW14)) – Cris 2012-06-11 05:28:22

相关问题