- 持久化机制:
save() 是将内存中的变更同步到持久化存储(SQLite)的唯一方式 - 事务边界:每次
save() 操作构成一个原子事务,保证数据一致性 - 错误处理:可能抛出
NSError,需用 do-catch 处理磁盘空间不足、权限问题等异常
do {
try modelContext.save()
} catch {
print("保存失败: \(error.localizedDescription)")
}
- 应用进入后台:iOS 自动触发未保存的更改
- 内存压力:系统可能提前持久化数据
- 定时机制:SwiftData 内置的自动保存间隔(约10秒)
let container = try ModelContainer(
for: Book.self,
configurations: ModelConfiguration(isAutosaveEnabled: false)
)
- 关键操作后:用户完成重要数据编辑时立即保存
- 批量操作中:每处理100-200条记录后手动保存,避免内存堆积
- 视图消失时:在 SwiftUI 的
.onDisappear 中保存
func importBooks(_ items: [JSONBook]) {
for (index, item) in items.enumerated() {
let book = Book(from: item)
modelContext.insert(book)
if index % 100 == 0 {
try? modelContext.save()
}
}
}
| 保存策略 | 优点 | 缺点 |
|---|
| 高频手动保存 | 数据丢失风险低 | 可能造成IO瓶颈 |
| 依赖自动保存 | 开发更简单 | 意外退出时可能丢失数据 |
| 混合模式 | 平衡安全性与性能 | 需要精细控制 |
print("有未保存的更改: \(modelContext.hasChanges)")
- 子上下文:子上下文的保存会推送到父上下文,但不会立即持久化
- 主上下文:需要显式调用主上下文的
save()
graph LR
A[子上下文.save()] --> B[父上下文]
B --> C[主上下文.save()]
C --> D[持久化存储]
- 重要用户数据采用即时手动保存
- 后台同步操作可依赖自动保存机制
- 始终处理
save() 可能抛出的错误 - 在单元测试中显式调用
save() 保证测试可重复性