Xcode 8中的核心数据Codegen失败

时间:2016-08-11 13:55:33

标签: core-data swift3 ios10

我有一个iOS应用程序,其中包含一个包含6个实体的Core Data模型。实体Name的设置如下:

  

班级名称:姓名

     

模块:当前产品模块

     

可待因:类定义

(所有其他5个实体的设置类似)。

问题1 (自行修复但留给后人)

代码IS在派生数据文件夹中生成...不是作为预期的〜类定义,而是作为扩展名(如Name+CoreDataProperties.swift命名。)Codegen是否设置为类定义似乎并不重要或类别/扩展 - 我仍然得到相同的结果。

好的,保持这种想法 - 突然间,现在正在生成类和扩展文件......看起来您需要删除项目的派生数据文件夹并在更新之间重新启动Xcode。忽略问题1

问题2

生成的文件忽略数据模型String属性和关系的可选标志设置 - 它们都是作为选项生成的

问题3 (自行修复但留给后人)

有序关系生成为OrderedSet(和编译错误)而不是NSOrderedSet(在重新生成时无法更改它们)

我的解决方法是暂时添加到项目中...... public typealias OrderedSet = NSOrderedSet

好了,现在编译器错误已经消失,似乎可以识别OrderedSet。忽略问题3.

问题4

以上都不重要,因为编译器无法找到它刚刚生成的文件。对于上面的Name实体:

  

:0:错误:没有这样的文件或目录:   ' // /Users/ashleymills/Library/Developer/Xcode/DerivedData/-grfqveelvqtlydbpwjmfdietnrss/Build/Intermediates/.build/Debug-iphonesimulator/.build/DerivedSources/CoreDataGenerated名称+ CoreDataClass.swift'   :0:错误:没有这样的文件或目录:   ' /Users/ashleymills/Library/Developer/Xcode/DerivedData/-grfqveelvqtlydbpwjmfdietnrss/Build/Intermediates/.build/Debug-iphonesimulator/.build/DerivedSources/CoreDataGenerated //名称+ CoreDataProperties.swift'

它正在寻找文件.Name+CoreDataClass.swift.Name+CoreDataProperties.swift的衍生数据 - 请注意'。'在文件名的前面。 (作为临时修复,我将生成的文件添加到项目中)

我认为我做错了,好像每个人都是这样,没有人能够建立一个核心数据项目......或者这些错误是否需要提升?

干杯 灰

(也在Apple开发论坛上提出)

6 个答案:

答案 0 :(得分:8)

关于问题1 ,在Inspector中为.xcdatamodel中的实体设置 Codegen 弹出窗口应该是这样的:

类别/扩展程序告诉Xcode生成一个文件,ClassName + CoreDataGeneratedProperties。

类定义告诉Xcode生成两个文件,上面提到的文件,加上ClassName + CoreDataClass。

然而,在Xcode 8.2中似乎存在一个错误。如果在更改其中一个弹出窗口后,只需构建(⌘B)或运行(⌘R),则更改将不会生效。例如,如果您从类定义更改为类别/扩展程序,甚至手动删除了第二个文件,它将重新出现。您甚至可能会发现弹出窗口恢复为原始设置。

为了使这些弹出窗口中的更改生效,您必须

  1. 保存(⌘S).xcdatamodel文件。
  2. 关闭所有项目窗口。
  3. 重新打开项目。
  4. 在下一次构建期间(如果在故事板中有@IBInspectable,项目打开时可能会自动发生),将生成或删除派生数据中受影响的文件以符合您的新设置。

    更新2016-12-22:谢谢你的评论,Ashley。我现在已经写完并将其提交给Apple Bug Reporter:29789727。更新2017-02-08: Apple已关闭29789727,因为它应该与21205277重复。

答案 1 :(得分:6)

问题4可以通过选择您想要自动生成的所有实体来修复(至少在最新的测试版,第6版中),然后在检查器中清除类 - >模块字段,以便它默认为“全局命名空间”。

答案 2 :(得分:2)

关于问题2:核心数据"可选" flag与Swift的可选概念无关。它们是无关的,并不代表同一件事。将Core Data属性标记为非可选并不意味着它是非可选的,因为Swift定义了该术语。区别在于:

  • Swift非选项必须始终具有非零值
  • 核心数据非期权在保存更改时必须具有非零值 ,但Core Data既不知道也不关心其他时间是否为零。

问题#4听起来像是Xcode让它的状态变得混乱,并且可以通过voodoo修复,例如手动清除派生数据文件夹(我知道)。我目前无法复制它,但这并不意味着它不是当前测试版中的错误。

答案 3 :(得分:1)

实际上很容易修复它。

转到配置:

enter image description here

然后删除积分。这些仅适用于较旧的项目。 导入语句在此之后已修复,您可以继续使用。

您还应该将模型放入Global命名空间。我有一个额外的命名空间,但我不知道为什么。

Apples approch就是你可以在自定义框架中使用它。

这个功能非常好,如果你让它工作;)

答案 4 :(得分:1)

看起来Xcode 8.2.1不会关闭codegen。 但您可以从.xcdatamodel内容文件中手动删除codeGenerationType="category"

关闭Xcode,删除codeGenerationType,删除DerivedData文件夹并重建。

将来会等待修复。

答案 5 :(得分:1)

我完全陷入了问题4 ,并且以上都没有为我工作。我使用代码生成。要解决它,我执行了以下步骤:

  1. 我在文本编辑器中打开了.xcdatamodel / content文件。 (在Xcode中右键单击.xcdatamodel并选择"在外部编辑器中打开"
  2. 在XML文件中,我确保每个实体都有codeGenerationType="class"
  3. 关闭并重新打开Xcode清除我的原始数据文件夹
  4. 它仍拒绝执行代码生成,因此我手动生成每个实体(编辑器,创建NSManageObject子类,选择所有实体)
  5. 构建项目。现在它也进行了代码生成,编译器错误出现了,说实体文件名被使用了两次。
  6. 删除了在步骤5中创建的手动创建的NSManagedObject子类。
  7. 之后,项目再次成功构建,问题就消失了。
  8. PS:如果您选择手动创建NSManageObject子类而不是使用代码生成,那么请确保在步骤2中从XML文件中的实体中删除codeGenerationType="class"