首页 > 解决方案 > Xcode 生成的 CoreData 文件无法被 Copy Bundle Resources 构建阶段处理

问题描述

我将 CoreData 添加到我的应用程序中MY_APP

问题:
在构建阶段开始时,我收到 3 个警告:

warning: The Swift file "/Users/reiner/Library/Developer/Xcode/DerivedData/  
MY_APP/Build/Intermediates.noindex/MY_APP.build/Debug-iphonesimulator/  
MY_APP.build/DerivedSources/CoreDataGenerated/MY_APP/XXX+CoreDataClass.swift"  
cannot be processed by a Copy Bundle Resources build phase (in target ‚MY_APP‘)  

warning: The Swift file "/Users/reiner/Library/Developer/Xcode/DerivedData/  
MY_APP/Build/Intermediates.noindex/MY_APP.build/Debug-iphonesimulator/  
MY_APP.build/DerivedSources/CoreDataGenerated/MY_APP/XXX+CoreDataProperties.swift"  
cannot be processed by a Copy Bundle Resources build phase (in target 'MY_APP')  

warning: The Swift file "/Users/reiner/Library/Developer/Xcode/DerivedData/  
MY_APP/Build/Intermediates.noindex/MY_APP.build/Debug-iphonesimulator/  
MY_APP.build/DerivedSources/CoreDataGenerated/MY_APP/MY_APP+CoreDataModel.swift"  
cannot be processed by a Copy Bundle Resources build phase (in target 'MY_APP')  

这 3 个文件未在 MY_APP 目标/构建阶段/复制捆绑资源下列出。

我的问题:
我的构建设置有什么问题,即这些警告的原因是什么,我该如何避免?

备注:此问题涉及不同的框架(核心数据),但与类似,尚无答案。

编辑:
我的项目有 2 个目标,用于 iOS 和 watchOS。到目前为止,核心数据仅在 iOS 上使用。
我现在尝试也为 watchOS 启用它,但我收到一个错误,因为它还.xcdatamodeld没有在 Build Phases / Copy Bundle Resources 中。
一旦我在那里添加它,核心数据就在手表上正确执行。

但是: 我收到了与上述相同的 3 个警告,这一次是针对手表扩展目标(总共 6 个警告)。
也许这是一个有用的提示。

标签: swiftxcodecore-databuildwarnings

解决方案


编辑:

我联系了 Apple,他们提供了解决方案:

当使用 coreData 选项创建 Xcode 项目“xxx”时,会创建核心数据模型文件“xxx.xcdatamodeld”并将其添加到目标 Build Phases Compile Sources。

比如说,在那里添加一个具有“属性”属性的实体“实体”。

如果在 Xcode 项目导航器中选择此模型文件并打开文件检查器,则会出现一个“代码生成”条目,默认设置为 Swift。这会自动创建 2 个文件 Entity+CoreDataClass.swift 和 Entity+CoreDataProperties.swift,但它们不会显示在项目导航器中。
构建项目成功,并且可以像往常一样在代码中使用属性 Entity.attribute。

但是:
如果在 Xcode 导航器中选择 xcdatamodeld 文件,Xcode 编辑器菜单有一个条目“Create NSManagedObject Subclass...”。如果选择此条目和 xxx 数据模型,则会再次创建 Entity+CoreDataClass.swift 和 Entity+CoreDataProperties.swift 2 个文件并显示在项目导航器中,并默认添加到目标中。

这意味着这些文件被添加了两次,因此会出现警告。

所以解决办法就是不使用这个编辑器命令,也不知道是干什么用的……</p>

编辑2:

我的错; 我看错地方了:

  • 在项目导航器中打开 xcdatamodeld。
  • 在其右侧的窗格中,选择一个实体。
  • 在右上角,打开检查器窗格。
  • 在它的右上角,选择数据模型检查器。
  • 有一个条目“Codegen”,可以选择手动/无。

如果选择此选项,则不会从 xcdatamodeld 自动生成代码,即,可以根据需要手动(通过使用 editor 命令)创建 NSManagedObject 子类,这些子类可以添加到目标 Compile Sources 部分。

上一个答案:

显然有两种使用 CoreData 的方法,或者 1) 仅使用PROJECT.xcdatamodeld文件,然后将其添加到Compile Sources Build Phase,或者 2) 通过NSManagedObject使用 Xcode 的Editor/Create NSManagedObject Subclass命令创建子类。

如果使用 1),则一切正常,但对所使用的实体没有属性访问权限。

如果使用 2),Xcode 会创建 2 个文件ENTITY+CoreDataClass.swiftENTITY+CoreDataProperties.swift. 这 2 个文件被添加到编译源构建阶段PROJECT.xcdatamodeld不能。如果仍然这样做,则会收到构建错误“意外重复任务”。但是,如果不这样做,该项目将在没有错误和警告的情况下构建。
但是,在运行时,该指令

let entity = NSEntityDescription.entity(forEntityName: "MyEntity", in: managedContext)! 

失败,因为它没有找到数据模型。
一种解决方法是添加PROJECT.xcdatamodeld目标/构建阶段/复制捆绑资源。然后代码执行得很好,但是会收到我在问题中描述的警告。


推荐阅读