2017-01-02 74 views
5

我从编码中休息了几个月,然后回过头来发现CoreData与Xcode8/iOS10/macOS Sierra的变化。为Xcode 8更新Objective C项目的正确方法核心数据NSManagedObject子类更改

我一直在试图让我的头在目标C中的新NSManagedObject子类生成,但网络上有很少。我有几件事我之前,我开始屠杀我的项目,完全,但第一搞乱事情需要澄清,有些事情我已经从闲逛发现,可能是其他人在那里有用...

东西在哪里是

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

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

事情Xcode中产生

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

当实体CODEGEN被设置为手动/无(这是旧的行为)创建一个使用编辑器 - >创建NSManagedObject子类生成您的项目中的4个文件...

实体+ CoreDataClass.h的NSmanagedObject子和实体+ CoreDataClass.m和 实体+ CoreDataProperties.h和实体+ CoreDataProperties.m

(先前版本的Xcode 7产生Entity.h,Entity.m, 实体+ CoreDataProperties.h和实体+ CoreDataProperties.m文件)

如果e ntity的codegen被设置为类定义,Xcode会在派生的数据文件夹中自动生成这4个相同的文件 - 不是项目,然后这些文件会标注一条评论,告诉您不要更改它们。

如果实体codegen设置为Category/Extension,Xcode将生成2个文件。这些文件标有评论,告诉你不要改变它们。这是...

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

这2档期待一个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类定义实体...

是有魔力下当您尝试#import entity.h时,会寻找实体+ CoreDataClass的引擎盖,或者我将不得不经过并找到#import entity.h的每个引用并将它们更改为#import entity + CoreDataClass.h?

5)我的权利假设,如果我想要一个NSManagedObject的子类,我想添加一个属性和一个方法,我应该设置Codegen到类别/扩展?如果我选择类别/扩展我必须创建我自己的NSmanagedObject子类文件,其只是entity.h不是实体+ CoreDataClass.h? 7)如果entity + CoreDataClass.h是entity.h文件新接受的命名格式,为什么生成的Category/Extension文件寻找一个普通的entity.h名称文件而不是实体+ CoreDataClass.h文件?这只是苹果部分的一个不一致之处,我应该接受或者我错过了我应该知道的东西?

谢谢。

+0

找到一些答案加上相应的WWDC视频的链接[这里](http://stackoverflow.com/a/39933534/1457385)。 – shallowThought

回答

2

好了 - 不少人看了一下,没有答案,所以我会尽力,并回答自己。

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

2)Entity + CoreDateClass.h/m文件是旧的Entity.h/m文件的直接替换。尽管对一个类别使用文件命名约定,但它们不是类别,不要让Apple的命名系统让你困惑。查看文件内部,并将类定义为Entity not Entity + CoreDataClass。

3)对于新的NSManagedObject子类(使用“类定义”选项自动生成)导入Entity + CoreDataClass.h而不是Entity.h。毕竟'这是你正在导入的文件,而不是内部定义的类。当使用它的类只是实体不实体+ ...4)如果你决定删除你的项目,删除你的NSManagedObject子类文件,然后将实体的代码转换为'类定义',你将需要通过项目并通过添加引用它们来更改所有的导入语句+ CoreDataClass为文件名。幸运的是,与Xcode不同的是,它并没有将它们标记为错误,因此很容易找到它们。 5)是 - 如果你想向NSManagedObject子类添加属性或功能,使用codegen“Category/Extension”选项。

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

7)是的,这只是苹果公司命名上的不一致。不要让它抛弃你,就像它一样。

最后,不要忘了...

如果你走使用代码生成的路径 - >类别/扩展,如果你添加一个额外的关系,实体,你需要更新你的实体.h文件。例如,如果您添加了一个名为Car的NSManagedObject子类的关系,您需要将@Class Car;添加到Entity.h。

相关问题