SwiftUI-使用 UserDefaults 存储少量数据

337 阅读2分钟

简介

UserDefaults让我们轻松存储少量数据 - 它会自动附加到我们的应用程序,这意味着一旦我们的应用程序启动,它就可以立即加载。虽然它非常有用(并且您将严重依赖它!)

“少量”没有附加具体数字,为了至少给您一个想法,您的目标应该是在其中存储不超过 512KB。

影响启动速度: 当您的应用程序启动时,UserDefaults存储的所有内容都会自动加载 - 如果您在其中存储大量内容,您的应用程序启动速度将会减慢。

UserDefaults支持的类型

字符串、数字、日期、URL 和二进制数据,以及这些类型的数组和字典。除了 URL(实际上只是花哨的字符串)之外,所有这些都是可以存储在 plist 文件中的相同类型。

适合存储诸如:用户上次启动App的时间、他们上次阅读的新闻报道,或其他被动收集的信息等信息。

使用方法

UserDefaults.standard.set(12, forKey: "Tap")  

UserDefaults.standard.integer(forKey: "Tap")  

问题:

  1. 默认值问题。应用程序第一次运行时,如果要取值,然而并未开始存,它会提供默认值
  2. 读写延迟问题。iOS 需要一点时间将数据写入永久存储 - 才能将更改实际保存到设备中。他们不会立即写入更新,因为您可能会连续进行多次更新,因此他们会等待一段时间,然后立即写出所有更改。

SwiftUI 提供了一个@AppStorage属性包装器, 它的作用是让我们有效地使用UserDefaults

@AppStorage

SwiftUI 封装UserDefaults在一个漂亮且简单的属性包装器中,称为@AppStorage – 它现在只支持功能的子集,但它确实很有帮助

struct ContentView: View {

    @AppStorage("tapCountKey") private var tapCount = 0

    var body: some View {

        Button("点击数: \(tapCount)") {

            tapCount += 1
        }
    }
}  

注意:使用了修饰符@AppStorage,而不是@State

  1. 我们对系统的UserDefaults访问是通过@AppStorage属性包装器进行的。其工作原理如下:当值发生变化时,它将重新调用该body属性,以便我们的 UI 反映新数据。
  2. 我们附加一个字符串名称,这是UserDefaults要存储数据的键。此处使用了“tapCountKey”,但它可以是任何字符串。
  3. 该属性的其余部分被声明为正常,包括提供默认值 0。如果UserDefaults 内部没有保存现有值,则将使用该默认值。

显然,使用@AppStorage比UserDefaults 更容易