objective-c - 为 Xcode 8 Core Data NSManagedObject 子类更改更新 Objective C 项目的正确方法

标签 objective-c core-data xcode8 ios10 nsmanagedobject

我从编码中休息了几个月,然后回来发现 CoreData 与 Xcode8/iOS10/macOS Sierra 的变化。

我一直试图了解 Objective C 中新的 NSManagedObject 子类生成,但网络上几乎没有。在我开始屠杀我的项目并将事情完全搞砸之前,我需要澄清一些事情,但是 首先,我从四处闲逛中发现的一些东西这可能对其他人有用......

东西在哪里

自动生成的文件深埋在 DerivedData 文件夹中。查看 USER->Library->Developer->Xcode->DerivedData->ProjectName-lotsOfRandomLetters->Build 然后继续打开文件夹,直到找到 DerivedSources->CoreDataGenerated。

自动生成的文件不会出现在您的项目文件夹或导航器中,但如果其中一个 Xcode 出现错误,则会为您显示源。

Xcode 生成的东西

共有三种代码生成设置 - 手动/无、类定义和类别/扩展。

当实体代码生成设置为手动/无(这是旧行为)时,使用 Editor-> Create NSManagedObject Subclass 创建 NSmanagedObject 子类会在您的项目中生成 4 个文件...

Entity+CoreDataClass.h 和 Entity+CoreDataClass.m 和
Entity+CoreDataProperties.h 和 Entity+CoreDataProperties.m

(上一版 Xcode 7 生成的 Entity.h、Entity.m、
Entity+CoreDataProperties.h 和 Entity+CoreDataProperties.m 文件)

如果实体的 codegen 设置为 Class Definition,Xcode 会在派生数据文件夹中自动生成这 4 个相同的文件 - 而不是项目,然后这些文件会标有注释,告诉您不要更改它们。

如果实体代码生成设置为类别/扩展,Xcode 会生成 2 个文件。这些文件标有注释,告诉您不要更改它们。这些是...

Entity+CoreDataProperties.h 和 Entity+CoreDataProperties.m

这两个文件期望 Entity.h 文件在项目中,如果不存在,将在 Xcode 中显示错误。这是您第一次能够在 Xcode 中看到这些文件之一的源代码。

这些文件中的内容

+ CoreDataProperties 文件似乎与以前版本的 Xcode 生成文件相同,除了一个附加项。它们包含实体/NSmanagedObject 的所有属性/属性以及处理具有一对多或多对多关系的实体的方法。新添加的方法是 fetchRequest 子类化 NSmanageObject 的新 fetchRequest 方法。

问题

1) 当您没有任何额外的属性/功能要添加到 NSManagedObject 子类时,类定义现在是代码生成的明显和最佳选择,因为它会自动为您更新文件(当您使用 cmd-s 保存项目时) ?

2) 使用 +CoreDataClass 命名文件遵循类上的类别约定,这意味着应该有一个类作为扩展名。

我是否认为 Entity+CoreDateClass .h/m 文件是旧 Entity.h/m 文件的直接替代品?并且它实际上不是一个类别,尽管有文件名?

3) 对于新的 NSManagedObject 子类,我应该导入 Entity+CoreDataClass.h 而不是 Entity.h?

4)如果我想通过删除大部分 NSManagedObject 子类文件来整理我的项目,我是否只需删除 Xcode 中的文件并将实体 codegen 设置为 Class Definition 或...

当您尝试 #import entity.h 或我是否必须遍历并找到对 #import entity.h 的每个引用并将它们更改为 #import entity+CoreDataClass.h 时,引擎盖下是否有寻找 entity+CoreDataClass 的魔法?

5)我是否正确假设如果我想要一个 NSManagedObject 子类,我想在其中添加一个属性和一个方法,我应该将 codegen 设置为 Category/Extension?

6) 如果我选择 Category/Extension 我必须创建我自己的 NSmanagedObject 子类文件,它只是 entity.h 而不是 entity+CoreDataClass.h?

7) 如果 entity+CoreDataClass.h 是 entity.h 文件的新接受的命名格式,为什么生成的 Category/Extension 文件会查找普通的 entity.h 名称文件而不是 entity+CoreDataClass.h 文件?这只是苹果方面的不一致,我应该接受还是我错过了我应该知道的事情?

谢谢你。

最佳答案

好的 - 很多人看了都没有答案,所以我会试着自己回答。

1)是的 - 如果您不需要向 CoreData 实体添加额外的属性/功能,请使用类定义。这将创建 4 个文件:
Entity+CoreDataClass.h 和 Entity+CoreDataClass.m 和 Entity+CoreDataProperties.h 和 Entity+CoreDataProperties.m 但你永远不会看到它们,因为它们隐藏在派生数据文件夹深处的视线之外。如果您需要检查属性名称,您可以在核心数据编辑器中查看,因为您无法访问这些文件。

2) Entity+CoreDateClass .h/m 文件是旧 Entity.h/m 文件的直接替代品。尽管使用类别的文件命名约定,但它们不是类别,不要让 Apple 的命名系统混淆你。查看文件内部,该类被定义为 Entity 而不是 Entity+CoreDataClass。

3) 对于新的 NSManagedObject 子类(使用“类定义”选项自动生成)导入 Entity+CoreDataClass.h 而不是 Entity.h。毕竟'它是您要导入的文件,而不是其中定义的类。使用该类时,它只是 Entity 而不是 Entity+...

4) 如果你决定整理你的项目,删除你的 NSManagedObject 子类文件,然后将实体代码生成切换到“类定义”,你将需要检查项目并更改所有引用它们的导入语句,方法是将 +CoreDataClass 添加到文档名称。幸运的是,这没什么大不了的,因为 Xcode 无论如何都会将它们全部标记为错误,因此很容易找到它们。

5) 是 - 如果您希望向 NSManagedObject 子类添加属性或功能,请使用代码生成“类别/扩展”选项。

6) 如果选择 Category/Extension,则必须创建我自己的 NSmanagedObject 子类文件,将其命名为 Entity.h。不要将其命名为 Entity+CoreDataClass.h,因为自动生成的 Entity+CoreDataProperty.h 正在寻找导入 Entity.h 文件。

7) 是的,这只是 Apple 的命名不一致。不要让它像我一样扔掉你。

最后,别忘了...

如果你沿着使用 codegen ->Category/Extension 的路线走,如果你向实体添加额外的关系,你将需要更新你的 Entity.h 文件。例如,如果您将关系添加到名为 Car 的 NSManagedObject 子类,则需要添加 @Class Car;到 Entity.h。

关于objective-c - 为 Xcode 8 Core Data NSManagedObject 子类更改更新 Objective C 项目的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41426484/

相关文章:

ios - 在 Xcode 8.2.1 中,我无法将 @IBOutlet 链接到 UI

swift - UIWebview 崩溃,错误为 :EXC_BREAKPOINT (CODE=EXC_I386_BPT, SUBCODE = 0X0)

iphone - 使用 NSUserDefaults 保存和加载数据需要帮助

objective-c - cocoa 核心数据文件名?

objective-c - 单例中的 NSMutableArray。强属性还是弱属性?

objective-c - 更改核心数据管理对象模型的文件名

iphone - NSManagedObjectContext Reset 似乎正在丢失数据?

swift - 当 WidgetCenter.shared.reloadAllTimelines() 被调用时,WidgetKit 不会从核心数据中获取更新的数据

ios - 更新到版本 8 后,Xcode 在 AppDelegate 中显示多个警告?

objective-c - UIColor、UIFont 等的外部常量