You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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()
}

数据模型截图

数据模型截图1
数据模型截图2
数据模型截图3


问题分析与修复方案

这个错误的核心是实体关系的模型配置与代码类型不匹配:系统试图对CDIRunningDuration实例调用集合专属的count方法,说明某个关系的配置和实际代码处理逻辑完全相反。

结合模型截图推断,大概率是CDISession/CDIApp与CDIRunningDuration的关系配置出错:

  • 若CDISession的runningDurations被设为一对一,但生成的子类按一对多生成了集合属性;
  • 或CDIRunningDuration的session/app被设为一对多,但代码里把它当成单个对象赋值,都会触发该错误。

修复步骤

  1. 重新生成NSManagedObject子类
    打开xcdatamodeld文件,全选所有实体,右键选择Create NSManagedObject Subclass...,确保生成的属性类型与关系匹配:

    • 一对多关系(如CDISession的runningDurations)属性应为@NSManaged public var runningDurations: NSSet?
    • 多对一关系(如CDIRunningDuration的session)属性应为@NSManaged public var session: CDISession?
  2. 核对模型关系配置
    打开数据模型编辑器,逐一检查:

    • CDISession → runningDurations:关系类型设为To Many,反向关系对应CDIRunningDuration的session(类型To One)
    • CDIApp → runningDurations:同上,关系类型设为To Many
    • CDIRunningDuration的session和app:关系类型均设为To One
  3. 清理编译缓存
    执行Product > Clean Build Folder,删除派生数据后重新编译项目。

调试优化

代码中try! moc.save()会掩盖具体错误细节,建议替换为do-catch块捕获完整错误信息:

do {
    try moc.save()
} catch {
    print("保存失败: \(error.localizedDescription)")
    print(error)
}

内容的提问来源于stack exchange,提问作者Owen Zhao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:43:17