Xcode 复制捆绑资源构建阶段无法处理生成的 CoreData 文件

Xcode generated CoreData files cannot be processed by Copy Bundle Resources build phase

我将 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 target/Build Phases/Copy 捆绑资源下列出。

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

备注:此问题涉及不同的框架(核心数据),但类似于this one,目前还没有答案。

编辑:
我的项目有 2 个目标,分别用于 iOS 和 watchOS。到目前为止,核心数据仅用于 iOS.
我现在也尝试为 watchOS 启用它,但出现错误,因为 .xcdatamodeld 尚未在构建阶段/复制捆绑资源中。
一旦我将它添加到那里,核心数据就会在手表上正确执行。

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

一种处理 Xcode 的方法,近年来每个版本的错误似乎越来越多:

  • 退出并重新启动 Xcode。
  • 如果这不起作用,请对 .xcodeproj 包执行 显示包内容 并在文本编辑器中打开 .pbxproj 文件。在文件中搜索 XXX+CoreDataClass。在文件中搜索未出现此警告的其他 .swift 文件。比较两个搜索结果。可能需要手动编辑 .pbxproj 文件。

编辑:

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

当使用 coreData 选项创建 Xcode 项目“xxx”时,将创建核心数据模型文件“xxx.xcdatamodeld”并将其添加到目标构建阶段编译源中。

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

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

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

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

所以解决方法是不要使用这个编辑器命令,我也不知道它是干嘛的...

编辑 2:

我的错;我看错地方了:

  • 在项目导航器中打开 xcdatamodeld。
  • 在它右边的窗格中,select 一个实体。
  • 在右上角,打开检查器窗格。
  • 在它的右上角,select 数据模型检查器。
  • 有一个条目“Codegen”,其中可以 select Manual/None。

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

上一个回答:

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

如果使用 1),则一切正常,但无法 属性 访问所使用的实体。

如果使用 2),Xcode 会创建 2 个文件 ENTITY+CoreDataClass.swiftENTITY+CoreDataProperties.swift。这 2 个文件被添加到编译源构建阶段PROJECT.xcdatamodeld 不能。不管怎样,如果有人这样做,就会得到构建错误“意外的重复任务”。但如果没有,项目构建时不会出现错误和警告。
但是,当运行时,指令

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

失败,因为它没有找到数据模型。
解决方法是将 PROJECT.xcdatamodeld 添加到 target/Build Phases/Copy Bundle Resources。然后代码执行正常,但会收到我在问题中描述的警告。

对我来说,导致问题的原因是 Build PhasesCopy Bundle Resources 步骤中的 .xcdatamodeld 文件针对警告中指定的目标:在您的情况下,MY_APP.我从 Copy Bundle Resources 步骤中删除了该文件,所有警告都消失了。