我将CoreData添加到了我的应用MY_APP
:
xcdatamodeld
文件来定义数据模型
具有几个属性的单个实体XXX
。 XXX+CoreDataClass.swift
和XXX+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条警告)。
也许这是一个有用的提示。
答案 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:
我的错;我在看错地方:
如果选择此选项,则不会从xcdatamodeld自动生成任何代码,即,可以手动(通过使用editor命令)创建NSManagedObject子类,并根据需要将其添加到目标“编译源”部分。
上一个答案:
显然有2种使用CoreData的方式,一种是仅使用PROJECT.xcdatamodeld
文件,然后将其添加到编译源构建阶段,或者2)通过创建{ {1}}子类,使用Xcode的 Editor / Create NSManagedObject子类命令。
如果使用1),则一切正常,但其中一个对所使用的实体没有属性访问权限。
如果使用2),则Xcode将创建两个文件NSManagedObject
和ENTITY+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的方法,近年来,每个版本似乎越来越多地出现问题:
.xcodeproj
软件包上执行显示软件包内容,然后在文本编辑器中打开.pbxproj
文件。在文件中搜索XXX+CoreDataClass
的出现。在文件中搜索是否出现其他.swift
文件,这些文件不会创建此警告。比较两个搜索结果。可能需要手动编辑.pbxproj
文件。