SwiftData

SwiftData|在 AppIntent 中使用 ModelContainer

使用 @Dependency @Dependency 是 App Intents 框架专用的属性包装器,用于依赖注入。 常用的实际场景 使用 @Dependency 注入 ModelContainer 使用方法 直接使用 DataModel 单例(推荐) 是否能访问完整 ModelContainer 数据? 经过测试,直接使用 DataModel 单例,可以正常查询到主 App 中的完整数据: 使用 @Dependency 的方式,如果注入的也是 DataModel.shared.modelContainer 实例,那么也可以正常获取到所有数据:
廖林

SwiftData|为 App 添加预设数据

想象一下,一个代办事项 App 需要提供标签功能,并且你想为 App 提供一些预设的标签供用户选择。 * 使用枚举来实现标签功能。这会导致用户无法创建自定义标签,因此枚举是写死的。 * 使用 SwiftData 实现标签功能 —— 这时候就需要为 SwiftData 生成预设数据。 SwiftData 创建预设数据的挑战 一种最简单的方法是,使用枚举来定义预设数据,并在 App 启动时检查是否有预设数据,如果没有就自动创建并添加 SwiftData。 这看起来很简单,但在实践中仍然存在一些困难。 CloudKit 导致的数据重复 如果启用了 CloudKit 云同步,当用户在同一个 Apple 账户的另一台设备安装,或者同一台设备卸载后再次安装时,由于 iCloud 数据同步存在延迟,会导致初始化程序创建重复的 SwiftData 数据。 因此,我们不能够简单的仅通过检查本地是否有数据来决定是否添加预设数据。 解决方案:需要同时检查 CloudKit 云端,仅在本地和云端均无数据时,才执行添加操作。
廖林

SwiftData|使用 ModelActor 存在数据更新延迟问题

问题案例 在 MONO 记账中,在账单详情页面修改账单的报销状态:待报销或已报销。修改之后,报销统计数据无法正确及时的更新(有时更新,有时不更新,结果不可测)。 排查发现原因如下: 1. 在 ReimbursementView 组件中,更新报销状态时只使用 Picker 组件,未显式调用 modelContext.save() 进行手动保存。 2. 统计数据在 ReimbursementViewModel 中计算,通过调用 actor 中的方法进行计算。 和 Task.detach 无关 既然在 ReimbursementViewModel 中,通过 Task.detached 在后台调用 actor 方法执行计算任务。如果不使用 Task.detached ,该问题是否仍然存在? 经过测试,即使修改为 Task,
廖林