SwiftData 教程与示例:将 SwiftData 对象与 SwiftUI 组件绑定(八)

了解如何将 SwiftUI 中支持双向绑定的组件(例如 Picker、TextField),绑定到 SwiftData 对象,并确保在数据更新时自动保存更新。

SwiftData 教程与示例:将 SwiftData 对象与 SwiftUI 组件绑定(八)

SwiftUI 提供了一些支持数据双向绑定(Two-Way Binding)的组件,例如 PickerTextFieldToggleSlider 等。这种绑定机制允许数据模型与 UI 组件之间相互更新,当组件的值发生更改时,绑定的属性值自动更新;反之亦然。

因此,我们有两个疑问:

  • 是否可以将 SwiftData 对象绑定到 SwiftUI 的组件上(如 Picker)?
  • 当数据更新时,SwiftData 数据是否会自动保存?

答案是肯定的,你可以将 SwiftData 对象与 SwiftUI 组件绑定,并且数据更新时可以自动保存——这是 SwiftData 的核心优势之一。

使用 @Bindable 属性包装器

@Bindable 属性包装器是 Observation 框架的一部分,它让任何@Observable 对象的属性支持绑定。

SwiftData 是基于 Observation 框架开发,因此 SwiftData 模型对象当然也支持使用 @Bindable。

数据如何自动保存

SwiftData 提供了一个 autosaveEnabled 属性,用于指示 SwiftData 上下文是否在发生某些事件时,自动保存任何待处理的更改。

autosaveEnabled | Apple Developer Documentation
A Boolean value that indicates whether the context should automatically save any pending changes when certain events occur.

SwiftData 默认将主 mainContext 的 autosaveEnabled 属性设置为 true,这就是会自动保存的原因。

@Bindale 带来的潜在性能问题

在 SwiftData 中使用 @Bindable 的性能问题
在 SwiftData 中直接使用 @Bindable 绑定并更新值,可能导致性能方面的问题。