为什么一个子类NSManagedObject?

时间:2011-10-30 20:02:01

标签: cocoa core-data nsmanagedobject

我已经阅读了很多关于NSManagedObject,Apple文档以及更多内容的SO问题,但我仍然没有真正得到NSManagedObject的子类 - 它起什么作用?

在Apple文档中它讨论了我怎么不能覆盖一堆方法,不应该使用自定义实例变量,等等和blah(我还不了解其中的一些),等等 - 所以什么我可以用NSManagedObject吗?有哪些限制,必须遵循的指导方针,以及哪些不是限制?

我正在尝试制作一个小盒子绘图程序来学习Core Data,我正在考虑将“draw”方法添加到NSManagedObject的子类中,以便视图可以告诉他们为自己绘制 - 这是允许?

所以,我的一句话中的问题是,子类化NSManagedObject和任何其他类之间的“真正”区别是什么 - 核心数据用它做什么?

如果这太宽泛,我会尝试缩小我的问题或者其他事情。

1 个答案:

答案 0 :(得分:25)

  

我仍然没有真正得到NSManagedObject的子类 - 它起什么作用?

开发人员的便利性 - 在CodeSense,更短的语法和一些编译时检查方面,有助于防止密钥拼写错误。

  

那么NSManagedObject怎么办?有哪些限制,必须遵循的指导方针,以及哪些不是限制?

Xcode中内置的UI将为您创建NSManagedObject子类 - 您实际上不需要手动执行它 - 但是,基本上,它们只是NSManagedObject并且具有一些属性。不使用@synthesize或类似的,你使用@dynamic而Apple会为你处理其余的事情 - 将这些属性连接到getter / setter,模仿你通常使用“bare”{{ 1}}。

  

我正在尝试制作一个小盒子绘图程序来学习Core Data,我正在考虑将“draw”方法添加到NSManagedObject的子类中,以便视图可以告诉他们为自己绘制 - 这是允许?

你可以....但我不会。这听起来像糟糕的设计 - 尝试将模型控制器分开。

模型对象不应包含业务逻辑/绘图代码。将模型简单地用作应用程序的“状态”。让其他东西对绘图负责。另外,虽然我不能用绝对权威来说这个,但我相信如果您正在处理从NSManagedObject更新/检索信息的问题,那么会有一些开销。

基本上,就像处理NSManagedObject ... sorta一样。从字典中获取项目的效率低于访问NSDictionary的效率。

对于执行绘图等操作的应用程序 - 您可能希望通过为内存中的内容构建结构来避免这种开销,并且可能需要第二种类似的持久性/序列化结构(比如CoreData)。 / p>

  

所以,我的一句话中的问题是,“真正的”区别是什么   在子类化NSManagedObject和任何其他类之间 - 做什么   核心数据用它吗?

我想说 - 不要手工创建NSManagedObject的子类 - 使用Xcode给你的东西。如果你想要更多(除了可能是自定义构造函数),那么你可能正在咆哮错误的树。

修改

我认为当我说“根本没有手工创建NSManagedObject”时,我的意思可能会有些混乱

详细说明并纳入其中一个回复:

从Xcode中的数据模型设计器开始,创建模型,并使用以下菜单选项:

enter image description here

然后,您可以修改生成的类以包含自定义:

  • 构造
  • 数据转换方法
  • 验证
  • 格式
  • 排序描述符
  • 过滤器

如果您的用例不适合该列表,您应该认真考虑将其放在其他位置(如使用“Draw”方法的示例)。

上面提到的所有这些内容都可以添加到由Xcode为我们创建的NSManagedObject子类(我们没有“手工创建”) - 它们都围绕着直接处理数据(格式/转换) / etc)和/或将数据从Core Data中拉出(过滤/排序)。

他们不添加iVars,他们不会在数据存储和检索范围之外执行任何复杂的操作。