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

在App Entity定义中使用数据控制器共享实例时崩溃求助

App Intent中访问Core Data共享实例引发崩溃问题

在应用快捷指令的AppEntity定义中,访问数据控制器共享实例时出现unrecognized selector sent to instance异常崩溃,崩溃关联[NSCFString bytes]调用。

代码实现细节

主应用中的DataController配置

主应用通过@StateObject声明DataController,并通过环境传递:

struct myApp: App {
    
    @StateObject var dataController: DataController
 
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environmentObject(dataController)
        }
    }

    init() {
        _dataController = StateObject(wrappedValue: DataController.shared)
}

App Entity与查询逻辑

App Entity和小组件均通过共享实例访问DataController,简化代码如下:

struct MyAppEntity: AppEntity {
    
    @Property(title: "Name")
    var name: String?

    // ... 省略部分代码
    
    struct MyAppEntityQuery: EntityQuery {
        
        // 选项1:顶层声明会触发非Sendable类型警告
        let dataController = DataController.shared
        
        func entities(for identifiers: [MyAppEntity.ID]) async throws -> [MyAppEntity] {
            // 选项2:函数内声明无Sendable警告,但仍会崩溃
            let dataController = DataController.shared
            let items = dataController.getAllItems()

            // ... 使用items生成消歧列表
        }
        
        // ... 省略部分代码
    }
}

无论采用哪种声明方式,都会触发崩溃;顶层属性声明时还会提示DataController不符合Sendable协议的警告。

崩溃触发点

崩溃发生在dataController.getAllItems()方法内部调用viewContext.fetch(Item.fetchRequest())时,属于间歇性触发:

  • 删除/添加数据项时可能出现
  • 应用启动时偶发(iOS会在启动时实例化App Entity,执行相关代码)
  • 直接使用应用快捷指令时却能正常运行

已尝试的操作与疑问

  • 尝试使用SwiftUI的@FetchRequest包装器,但当前环境中没有可用的managed object context
  • 怀疑App Entity代码执行时,DataController共享实例中的Core Data栈尚未完全初始化
  • 已通过复用小组件的方案:将Core Data数据同步到App Group容器的JSON文件中,通过查询JSON获取数据解决了问题,但仍未明确崩溃根源

补充信息

2024年4月有相关技术问答针对类似场景提供了有用的分析思路。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:15:28