由于它提供的便利之一SwiftData
是在模型上下文中添加或更改某些内容时自动保存记录,那么显式调用save()
会有什么区别吗?我想在两种情况下,SwiftData
都会决定吗?
@ModelActor
public actor DataHandler {
@discardableResult
public func new(item: Item) throws -> PersistentIdentifier {
modelContext.insert(item)
try modelContext.save()
return item.persistentModelID
}
@discardableResult
public func newEmptyItem() throws -> PersistentIdentifier {
let item = Item()
modelContext.insert(item)
try modelContext.save()
return item.persistentModelID
}
我可以删除这一行吗:
try modelContext.save()
不用担心?
不是。从一些简单的实验中可以观察到,虽然 while
save
被调用,但它并不是与 同步调用的insert
。它是异步调用的,可能在下一个 Run Loop 周期中。这很合理,因为如果你在循环中调用,并且只对所有这些sinsert
执行一次保存操作,那么很可能对性能有利。insert
如上所示,如果您删除手动
save
调用,返回的 IDnew
将newEmptyItem
是一个临时 ID,在后续调用后将失效save
。所以在这种情况下,手动调用save
至关重要!另请参阅以下文档insert
:当您使用
@ModelActor
宏时,ModelContext
该参与者的属性将autosaveEnabled
设置为 false,因此实际上您有责任手动调用save()
,无论是像上面那样直接在方法中完成,还是在单独的“保存所有”更改方法中完成,否则不会将任何内容保留到磁盘。2023 年的 WWDC 视频中提到,当
ModelContext
手动创建 a 时, theautosaveEnabled
始终设置为 false。因此,对我来说,结论是,只有在我们使用视图时,
Environment(\.modelContext)
我们才能安全地依赖自动保存功能,并且我们应该始终假设它在任何其他情况下默认被禁用。当然,还存在@Sweeper 的回答中提到的返回标识符的问题