Core Data 代码生成导致构建失败

Posted

技术标签:

【中文标题】Core Data 代码生成导致构建失败【英文标题】:Core Data code generation causes build failure 【发布时间】:2016-09-17 09:22:34 【问题描述】:

我正在使用新的 Xcode 8 代码生成功能为我的 Core Data 模型使用 Class Definition 作为 Codegen 选项。

当我构建时,我的每个实体都会得到以下输出:

<unknown>:0: error: no such file or directory: ‘/path/to/DerivedSources/CoreDataGenerated/Model/.Entity+CoreDataClass.swift'
<unknown>:0: error: no such file or directory: ‘/path/to/DerivedSources/CoreDataGenerated/Model/.Entity+CoreDataProperties.swift’
...
Command /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc failed with exit code 1

在检查文件时,我可以看到以下内容:

Entity+CoreDataClass.swift:

import Foundation
import CoreData


public class Entity: NSManagedObject 


Entity+CoreDataProperties.swift

import Foundation
import CoreData
import 

extension Entity 

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Entity> 
        return NSFetchRequest<Entity>(entityName: “Entity");
    

    @NSManaged public var title: String?


在第二个中,不应该出现的明显的事情是空的 import 语句,我猜这是导致崩溃的原因。

我会做错什么吗?这是一个错误吗?

我已经尝试了所有通常的、干净的、干净的构建文件夹,但没有成功重新启动 Xcode/Mac。

【问题讨论】:

我也得到了空的导入语句。似乎是一个新的 Apple 错误。 看起来问题应该以比实际更好的方式处理。你看到我下面的修复了吗?看来我还是做错了事 是的,我发现了一个问题:当创建新的托管对象并将它们转换为我的子类之一时,它会抛出说它无法转换。类名位于当前项目命名空间之外的命名空间中。 我现在也在构建和测试应用程序时也遇到了同样的问题。你知道解决方法吗? 我将Module 字段保留为当前项目,我只是删除了空的导入语句。我还没有使用代码生成。 【参考方案1】:

数据模型检查器中实体的Module 字段中有一个值,我删除了它,所以现在它是空的,占位符显示为“全局命名空间”。这似乎奏效了!

【讨论】:

那个,我不得不删除 Xcode 8 创建的@nonobjc public class func fetchRequest() -&gt; NSFetchRequest&lt;Item&gt; return NSFetchRequest&lt;Item&gt;(entityName: "Item"); Item 在这种情况下是实体名称。【参考方案2】:

Core Data 严重基于字符串。为您的实体使用诸如“实体”之类的名称可能会导致意外结果。还要避免在数据模型中使用名称,例如“description”、“item”或“attribute”等。如果您确实想使用这些名称,请在它们前面加上:“My_entity”或“ACEntity”之类的名称就可以了。

【讨论】:

以上是关于Core Data 代码生成导致构建失败的主要内容,如果未能解决你的问题,请参考以下文章

NSArrayController 子类添加 Core Data 对象需要啥?

使用 Core Data 等待 withTaskGroup 有时会失败

发布构建导致简单的 protobuf 代码失败

EF Core 添加迁移构建失败

BLE + Core Data 导致冻结(信号量等待陷阱)

Core Data、iCloud 和两个持久性存储失败