在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
相关产品推荐
相关产品推荐

