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

创建对接CoreData的通用MVVM连接器时触发NSInvalidArgumentException异常

问题原因

你遇到的崩溃是NSFetchedResultsController的强制要求:所有用于初始化该类的NSFetchRequest实例,必须指定sortDescriptors属性定义查询结果的排序规则,否则就会抛出你收到的这个异常。

排查思路

崩溃日志的reason字段已经明确给出了错误触发条件,直接定位到项目中创建NSFetchedResultsController的代码位置(也就是Model.swift的init方法),检查传入的fetchRequest是否设置了排序描述符即可快速定位问题。

修复方案

推荐通过扩展现有协议的方式适配要求,适配后所有实体类都可以自定义自己的默认排序规则,改动最小且符合现有架构设计:

步骤1:修改Entity协议

在Entity.swift中新增默认排序规则的协议要求:

import CoreData

protocol Entity: NSFetchRequestResult {
    associatedtype CurrentEntity: NSManagedObject
    static var name: String { get }
    // 新增默认排序规则要求
    static var defaultSortDescriptors: [NSSortDescriptor] { get }
}

步骤2:给ProductEntity实现排序规则

在ProductEntity.swift的Entity协议实现部分添加排序规则,可按需调整排序字段、升降序逻辑:

extension ProductEntity: Entity {
    typealias CurrentEntity = ProductEntity
    static let name: String = "Product"
    // 示例按商品名称升序排列
    static var defaultSortDescriptors: [NSSortDescriptor] {
        [NSSortDescriptor(key: "name", ascending: true)]
    }
}

步骤3:修改Model类的初始化逻辑

在Model.swift中创建fetchRequest后,给它赋值排序规则:

override init() {
    let fetchRequest = NSFetchRequest<T.CurrentEntity>(entityName: T.name)
    // 给查询请求设置排序规则
    fetchRequest.sortDescriptors = T.defaultSortDescriptors
    controller = NSFetchedResultsController(
        fetchRequest: fetchRequest,
        managedObjectContext: DataSource.shared.container.viewContext,
        sectionNameKeyPath: nil, cacheName: nil
    )
    // 原有后续逻辑保持不变
    super.init()
    controller.delegate = self
    do {
        try controller.performFetch()
        records.value = (controller.fetchedObjects ?? []) as [T.CurrentEntity]
    } catch {
        NSLog("Error: could not fetch objects")
    }
}

修改完成后重新运行项目即可解决崩溃问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:24:02