Xcode生成的CoreData文件无法通过副本捆绑资源构建阶段进行处理

时间:2018-12-13 11:06:09

标签: swift xcode core-data build warnings

我将CoreData添加到了我的应用MY_APP

  • 我通过创建一个包含以下内容的xcdatamodeld文件来定义数据模型 具有几个属性的单个实体XXX
  • 使用Xcode / Editor / Create NSManagedSubclass,Xcode创建了两个文件XXX+CoreDataClass.swiftXXX+CoreDataProperties.swift
  • 我写了一些代码来测试存储和从核心数据取回,一切正常。

问题:
在构建阶段的开始,我收到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目标/构建阶段/复制捆绑包资源下列出。

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

备注:该问题与其他框架(核心数据)有关,但与this one类似,后者尚无答案。

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

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

3 个答案:

答案 0 :(得分:4)

编辑:

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

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

说,在其中添加具有属性“ attribute”的实体“ Entity”。

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

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

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

因此解决方案是不使用此编辑器命令,我不知道它的用途是什么……

编辑2:

我的错;我在看错地方:

  • 在项目导航器中打开xcdatamodel。
  • 在其右侧窗格中,选择一个实体。
  • 在右上方,打开检查器窗格。
  • 在其右上方,选择数据模型检查器。
  • 有一个“ Codegen”条目,可以选择“ Manual / None”。

如果选择此选项,则不会从xcdatamodeld自动生成任何代码,即,可以手动(通过使用editor命令)创建NSManagedObject子类,并根据需要将其添加到目标“编译源”部分。

上一个答案:

显然有2种使用CoreData的方式,一种是仅使用PROJECT.xcdatamodeld文件,然后将其添加到编译源构建阶段,或者2)通过创建{ {1}}子类,使用Xcode的 Editor / Create NSManagedObject子类命令。

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

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

PROJECT.xcdatamodeld

失败,因为它找不到数据模型。
一种解决方法是将let entity = NSEntityDescription.entity(forEntityName: "MyEntity", in: managedContext)! 添加到目标/构建阶段/复制捆绑资源中。然后,代码可以很好地执行,但是将收到我在问题中描述的警告。

答案 1 :(得分:2)

对我来说,导致问题的原因是在.xcdatamodeld的{​​{1}}步骤的Copy Bundle Resources步骤中拥有Build Phases文件,对于警告中指定的目标:您的情况是MY_APP。我从Copy Bundle Resources步骤中删除了该文件,所有警告均消失了。

答案 2 :(得分:0)

一种处理Xcode的方法,近年来,每个版本似乎越来越多地出现问题:

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