SwiftData 默认会在适当的时机自动保存更改(称为 自动保存,Auto-Save)。然而,在某些情况下,需要显式调用 context.save() 来确保更改被保存。以下是默认保存机制和手动保存的区别,以及为什么需要手动保存的原因。
默认保存机制(Auto-Save)
1、触发时机
视图更新:当与 @Bindable 或 @StateObject 等相关的模型属性发生更改时,SwiftData 会在视图生命周期的合适阶段自动保存。
用户交互完成后:例如,当用户在一个界面中编辑数据并返回或结束编辑时,SwiftData 会触发保存。
2、限制
依赖视图的生命周期:如果操作发生在后台任务、迁移或异步流程中,自动保存可能无法正确触发。
延迟保存:为了性能优化,自动保存不是即时的。SwiftData 会批量处理更改并在稍后合适的时机保存,具体时间并不确定。
手动保存(Explicit Save)
在某些情况下,必须显式调用 context.save() 来确保更改立即保存到数据库。例如:
1、数据迁移
在数据迁移中,对模型数据进行了批量更改。这些更改发生在后台流程中,与视图生命周期无关,因此 自动保存不会触发。
显式调用 context.save() 确保所有修改被立即写入数据库。
for book in allBooks where book.date == nil {
book.date = Date() // 设置默认值
}
try context.save() // 确保迁移结果立即保存
2、异步任务或后台操作
当更改发生在异步任务中(如通过网络获取数据并更新数据库),需要手动保存,否则更改可能不会被及时保存。
Task {
let fetchedBooks = fetchBooksFromAPI()
for book in fetchedBooks {
context.insert(book) // 新增数据
}
try context.save() // 手动保存新增的数据
}
3、避免潜在的数据丢失
在某些情况下(如用户关闭应用或操作完成前终止任务),自动保存可能尚未触发。手动保存可以防止更改丢失。
总结
虽然 SwiftData 提供了自动保存功能,但在特定情况下(如批量操作、迁移、后台任务)依赖自动保存是不安全的。因此,需要显式调用 context.save(),特别是希望更改立即生效并持久化时。