调用Core Data save()时触发CDIRunningDuration count未识别选择器错误
Core Data save() 报错:unrecognized selector sent to instance
问题描述
调用Core Data的save()方法时触发错误:'[CDIRunningDuration count]: unrecognized selector sent to instance 0x600001a0fed0',数据模型结构简单,但无法定位错误原因。
相关代码
ContentView.swift
import SwiftUI import CoreData struct ContentView: View { @Environment(\.managedObjectContext) private var moc var body: some View { VStack(alignment: .leading) { Text("Hello World!") } .padding() .onAppear(perform: runTest) } private func runTest() { let session = CDISession(context: moc) session.startDate = Date() let app = NSWorkspace.shared.frontmostApplication! let runningApp = CDIApp(context: moc) runningApp.bundleURL = app.bundleURL let runningDuration = CDIRunningDuration(context: moc) runningDuration.app = runningApp runningDuration.timelength = 100.0 runningDuration.session = session try! moc.save() } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
Core_Data_IssueApp.swift
import SwiftUI @main struct Core_Data_IssueApp: App { var body: some Scene { WindowGroup { ContentView() .environment(\.managedObjectContext, ModelProvider.shared.container.viewContext) } } }
ModelProvider.swift
import Foundation import CoreData import AppKit class ModelProvider:ObservableObject { let container = NSPersistentContainer(name: "Model") private init() { container.loadPersistentStores { description, error in if let error = error { let alert = NSAlert(error: error) NSSound.beep() alert.runModal() } } } static let shared = ModelProvider() }
数据模型截图



问题分析与修复方案
这个错误的核心是实体关系的模型配置与代码类型不匹配:系统试图对CDIRunningDuration实例调用集合专属的count方法,说明某个关系的配置和实际代码处理逻辑完全相反。
结合模型截图推断,大概率是CDISession/CDIApp与CDIRunningDuration的关系配置出错:
- 若
CDISession的runningDurations被设为一对一,但生成的子类按一对多生成了集合属性; - 或
CDIRunningDuration的session/app被设为一对多,但代码里把它当成单个对象赋值,都会触发该错误。
修复步骤
重新生成NSManagedObject子类
打开xcdatamodeld文件,全选所有实体,右键选择Create NSManagedObject Subclass...,确保生成的属性类型与关系匹配:- 一对多关系(如
CDISession的runningDurations)属性应为@NSManaged public var runningDurations: NSSet? - 多对一关系(如
CDIRunningDuration的session)属性应为@NSManaged public var session: CDISession?
- 一对多关系(如
核对模型关系配置
打开数据模型编辑器,逐一检查:CDISession→runningDurations:关系类型设为To Many,反向关系对应CDIRunningDuration的session(类型To One)CDIApp→runningDurations:同上,关系类型设为To ManyCDIRunningDuration的session和app:关系类型均设为To One
清理编译缓存
执行Product > Clean Build Folder,删除派生数据后重新编译项目。
调试优化
代码中try! moc.save()会掩盖具体错误细节,建议替换为do-catch块捕获完整错误信息:
do { try moc.save() } catch { print("保存失败: \(error.localizedDescription)") print(error) }
内容的提问来源于stack exchange,提问作者Owen Zhao
相关产品推荐
相关产品推荐

