更新Xcode 8核心数据NSManagedObject子类更改的Objective C项目的正确方法

Sim*_*ver 5 core-data objective-c nsmanagedobject ios10 xcode8

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

我一直试图在Objective C中围绕新的NSManagedObject子类生成,但网上的内容很少.在我开始屠宰我的项目并完全搞砸了之前,我需要澄清一些事情,首先,我发现的一些事情可能对其他人有用...

事情在哪里

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

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

Xcode生成的东西

有三种codegen设置 - 手动/无,类定义和类别/扩展.

当实体codegen设置为manual/none(这是旧行为)时使用Editor-> Create创建NSmanagedObject子类NSManagedObject Subclass在项目中生成4个文件...

实体+ CoreDataClass.h和实体+ CoreDataClass.m和实体+ CoreDataProperties.h和实体+ CoreDataProperties.m

(以前的版本Xcode 7生成了Entity.h,Entity.m,Entity + CoreDataProperties.h和Entity + CoreDataProperties.m文件)

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

如果实体codegen设置为Category/Extension,Xcode将生成2个文件.这些文件标有注释,告诉您不要更改它们.这些是...

Entity + CoreDataProperties.h和Entity + CoreDataProperties.m

这两个文件期望Entity.h文件在项目中,如果不存在则会在Xcode中显示错误.这是您有一次能够在Xcode中查看其中一个文件的来源.

什么是这些文件

+ CoreDataProperties文件看起来与生成以前版本的Xcode生成文件的文件相同,只有一个添加.它们包含实体/ NSmanagedObject的所有属性/属性以及处理具有一对多或多对多关系的实体的方法.新增加的是fetchRequest子类化NSmanageObject的新fetchRequest方法的方法.

问题

1)当您没有任何额外的属性/功能添加到NSManagedObject子类时,类定义现在是codegen的明显和最佳选择,因为它会自动为您更新文件(当您使用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时,是否存在寻找实体+ 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名称文件而不是实体+ CoreDataClass.h文件?这只是苹果部分的不一致和我应该接受的东西,或者我错过了一些我应该知道的东西?

谢谢.

Sim*_*ver 3

好吧 - 很多人都看过但没有答案,所以我会尝试自己回答。

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。毕竟,这是您要导入的文件而不是内部定义的类。使用该类时,它只是实体而不是实体+...

4) 如果您决定通过删除 NSManagedObject 子类文件然后将实体 codegen 切换到“类定义”来整理您的项目,您将需要浏览该项目并通过将 +CoreDataClass 添加到文件名。幸运的是,这没什么大不了的,因为 Xcode 无论如何都会将它们全部标记为错误,因此很容易找到它们。

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

6) 如果您选择类别/扩展,您必须创建我自己的 NSmanagementObject 子类文件,将其命名为 Entity.h。不要将其命名为 Entity+CoreDataClass.h,因为自动生成的 Entity+CoreDataProperty.h 正在寻求导入 Entity.h 文件。

7) 是的,这只是苹果方面的命名不一致。不要让它让你失望,就像它让我失望一样。

最后,不要忘记...

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