Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 为什么一个子类NSManagedObject会这样?_Cocoa_Core Data_Nsmanagedobject - Fatal编程技术网

Cocoa 为什么一个子类NSManagedObject会这样?

Cocoa 为什么一个子类NSManagedObject会这样?,cocoa,core-data,nsmanagedobject,Cocoa,Core Data,Nsmanagedobject,我已经阅读了许多关于NSManagedObject、Apple文档等的问题,但我仍然不知道子类化NSManagedObject的目的是什么——它扮演了什么角色 在Apple文档中,它谈到了我如何不能覆盖一堆方法,不应该使用自定义实例变量,等等等等(我还不了解其中的一些),那么我可以用NSManagedObject做什么呢?什么是限制,必须遵循指导原则,什么不是限制 我正在尝试制作一个小方框绘图程序来学习核心数据,我正在考虑向NSManagedObject的子类添加“draw”方法,这样视图就可以

我已经阅读了许多关于NSManagedObject、Apple文档等的问题,但我仍然不知道子类化NSManagedObject的目的是什么——它扮演了什么角色

在Apple文档中,它谈到了我如何不能覆盖一堆方法,不应该使用自定义实例变量,等等等等(我还不了解其中的一些),那么我可以用NSManagedObject做什么呢?什么是限制,必须遵循指导原则,什么不是限制

我正在尝试制作一个小方框绘图程序来学习核心数据,我正在考虑向NSManagedObject的子类添加“draw”方法,这样视图就可以告诉他们自己绘制-这允许吗

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

如果这太宽泛了,我会尽量缩小我的问题范围

我仍然不知道子类化NSManagedObject的目的是什么——它扮演什么角色

为开发人员带来的便利-在代码感知、更短的语法和一些编译时检查方面,这些检查有助于防止密钥拼写错误

那么我可以用NSManagedObject做什么呢?什么是限制,必须遵循指导原则,什么不是限制

Xcode中内置的UI将为您创建NSManagedObject子类—您真的不需要手动创建—但基本上,它们只是带有一些属性的
NSManagedObject
s。你不用
@synthesis
或类似的工具,而是使用
@dynamic
,苹果会为你处理剩下的部分——将这些属性连接到getter/setter,它们模仿你通常使用“裸”
NSManagedObject
所做的事情

我正在尝试制作一个小方框绘图程序来学习核心数据,我正在考虑向NSManagedObject的子类添加“draw”方法,这样视图就可以告诉他们自己绘制-这允许吗

你可以。。。。但我不会。这听起来像是糟糕的设计——试着将模型和控制器分开

模型对象不应包含业务逻辑/图形代码。仅将模型用作应用程序的“状态”。让其他人对这幅画负责。另外,虽然我不能绝对权威地这么说,但我相信如果您要从
NSManagedObject
更新/检索信息,会有一些开销

(基本上,这就像处理
NSDictionary
…排序。从字典中抓取项目比访问
ivar
效率低)

对于一个像绘图这样的应用程序,您可能希望通过为内存中的东西创建一个结构,以及为持久性/序列化(比如CoreData)创建第二个类似的结构来避免这种开销

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

我会说——根本不要手动将NSManagedObject子类化——使用Xcode提供的东西。如果你想要更多的(除了自定义构造函数),那么你可能找错了方向

编辑:

我想,当我说“不要手动将NSManagedObject子类化”时,可能对我的意思有些困惑

要详细说明并纳入其中一个响应:

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

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

  • 建设者
  • 数据转换方法
  • 验证
  • 格式化
  • 排序描述符
  • 过滤器
如果您的用例不符合该列表,那么您应该认真考虑将其放在其他地方(如您使用“Draw”方法的示例中)

上面提到的所有这些东西都可以附加到一个NSManagedObject子类上,这个子类是由Xcode为我们创建的(我们不是“手工”创建的)——它们都围绕着直接处理数据(格式/转换/等等)和/或从核心数据中提取数据(过滤/排序)


它们不添加IVAR,不执行数据存储和检索范围之外的任何复杂操作

这个答案大部分都是好的,但我不同意“不要手动将NSManagedObject子类化”——我还没有一个最终不会将NSManagedObject子类化的核心数据项目。处理瞬态变量和数据转换是非常常见的。它还提供更好的类型安全性。实际上,为了保持一致性,我几乎总是为每个实体创建一个子类。有些是子类的,有些不是子类的,这会让人感到困惑。我还要补充一点:(1)自定义验证,(2)工厂方法,(3)字符串格式,(4)关联排序描述符和筛选谓词的类方法。@RobNapier-哦,绝对是-我所说的“手工”是“如果您正在创建一个核心数据实体,并且您正在使用它来存储核心数据中的内容,并且Xcode将/可以为您创建实体的开始,那么对于一个子类来说,这是一个合适的位置“-正如我提到的,构造函数绝对是我可以看到添加的东西-数据转换方法以及你提到的都很好-但不要无缘无故地把所有本来是NSObject子类的东西都变成NSManagedObject子类(就像OP关于方框的示例中那样)。我不知道我是否同意任何业务逻辑;让你的模型“更聪明”比让你的控制器乱七八糟更有意义。不过,同意“无视图”的说法。@wkhath-我没有说业务逻辑应该放在您的
UIViewController
s中。典型的场景是三层-UI |业务逻辑|数据访问。