【问题标题】:Correct way to update Objective C project for Xcode 8 Core Data NSManagedObject subclass changes为 Xcode 8 Core Data NSManagedObject 子类更改更新 Objective C 项目的正确方法
【发布时间】:2017-05-16 12:57:56
【问题描述】:

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

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

东西在哪里

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

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

Xcode 生成的东西

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

当实体代码生成设置为手动/无(这是旧行为)时,使用编辑器创建 NSmanagedObject 子类-> 创建 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 个相同的文件 - 而不是项目,然后用注释标记这些文件,告诉您不要更改它们。

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

Entity+CoreDataProperties.h 和 Entity+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 设置为 Class Definition 或...

当您尝试#import entity.h 时,是否存在寻找实体+CoreDataClass 的魔法,或者我必须通过并找到对#import entity.h 的每个引用并将它们更改为#import entity+ CoreDataClass.h ?

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

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

7) 如果 entity+CoreDataClass.h 是 entity.h 文件的新接受命名格式,为什么生成的类别/扩展文件会查找纯 entity.h 名称文件而不是 entity+CoreDataClass.h 文件?这只是苹果部分的不一致,我应该接受的东西还是我错过了我应该知道的东西?

谢谢。

【问题讨论】:

  • 找到一些答案以及相应 WWDC 视频here 的链接。

标签: objective-c core-data xcode8 ios10 nsmanagedobject


【解决方案1】:

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

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 子类添加属性或功能,请使用 codegen“Category/Extension”选项。

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

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

最后,别忘了……

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

【讨论】:

    猜你喜欢
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多