SwiftUI中Core Data添加第二个子实体崩溃问题求助
SwiftUI + Core Data Playground 崩溃问题:添加第二个ListItemEntity触发
unrecognized selector错误 问题背景
开发SwiftUI+Core Data的Playground项目时遇到异常崩溃:
- ListEntity相关视图运行正常
- 在第三个视图(可搜索的NameEntity列表,点击可添加/删除对应ListEntity的ListItemEntity)中,添加第一个ListItemEntity正常,添加第二个时应用直接崩溃,且未进入catch块捕获错误
- DataProvider中批量添加实体的测试代码可正常运行,仅视图中操作触发崩溃
实体关系定义
项目包含三个Core Data实体:
- ListEntity:含
name属性,与ListItemEntity为一对多关系 - ListItemEntity:含
flag属性,与ListEntity、NameEntity均为一对一关系 - NameEntity:含
name属性,与ListItemEntity为一对多关系
错误信息
error: Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. -[NameEntity compare:]: unrecognized selector sent to instance 0x600002118ff0 with userInfo (null)
排查方向与解决方案
崩溃核心原因是:Core Data处理上下文变更时,尝试调用NameEntity的compare:方法,但该实体未实现此方法。以下是具体修复步骤:
1. 检查FetchRequest的排序描述符
确认所有涉及NameEntity的FetchRequest,排序描述符指向实体属性而非实体本身:
- 错误示例:
NSSortDescriptor(key: "self", ascending: true) - 正确示例:
NSSortDescriptor(keyPath: \NameEntity.name, ascending: true)
2. 修正ForEach的ID指定
如果视图中用ForEach遍历NameEntity列表,需显式指定基于objectID的唯一标识,避免SwiftUI尝试比较实体实例:
ForEach(nameEntities, id: \.objectID) { nameEntity in // 视图内容 }
3. 检查Core Data模型的关系排序设置
打开Core Data模型编辑器,检查NameEntity与ListItemEntity的一对多关系,确认"Sort Descriptors"中未错误设置针对实体的排序(应指向具体属性,如name)。
4. 实现Comparable协议(可选)
若业务需要对NameEntity实例进行比较,可让其子类实现Comparable协议:
extension NameEntity: Comparable { public static func < (lhs: NameEntity, rhs: NameEntity) -> Bool { return lhs.name ?? "" < rhs.name ?? "" } public static func == (lhs: NameEntity, rhs: NameEntity) -> Bool { return lhs.objectID == rhs.objectID } }
内容的提问来源于stack exchange,提问作者ostojan
相关产品推荐
相关产品推荐

