Swift - UserDefaults 设置未保存在框架内

Posted

技术标签:

【中文标题】Swift - UserDefaults 设置未保存在框架内【英文标题】:Swift - UserDefaults setting not getting saved inside framework 【发布时间】:2021-03-12 12:34:25 【问题描述】:

我有一个框架,它生成一次设备 UUID 并使用 UserDefaults 保存它。该应用程序可以访问 UserDefaults 并且一切都按预期工作。但是,在某些情况下,框架不会访问 UserDefaults。 我在 iPhone 8 上使用 synchronize() 方法解决了这个问题:

  func getDeviceID() -> String 
      if let device = UserDefaults.standard.object(forKey: "DeviceID") as? String 
           return device
        else 
           let device = UUID().uuidString
           UserDefaults.standard.set(device, forKey: "DeviceID")
           UserDefaults.standard.synchronize() // this line helped with an iPhone 8
           return device
       
   

但是,在较旧的第一代 iPhone SE 上,问题又出现了。 首先,为什么会发生这种情况,为什么 synchronize() 方法似乎有助于更新设备? (两部手机都运行 ios 13) 从框架内访问 UserDefaults 时是否有任何已知限制?

【问题讨论】:

【参考方案1】:

如果在将 deviceId 写入 UserDefaults 后立即读取数据时失败 那么它可能与 UserDefaults 实际将数据存储到磁盘的方式有关。

实际写入磁盘是异步的,由 NSUserDefaults 自动批处理。 检查this

因此,运行新 iOS 版本的旧设备可能会变慢。

【讨论】:

是的,这是有道理的@swiftyDeadpool,但这应该会在一段时间后得到解决。但行为完全不同:每次调用此函数时都会生成一个新的设备 ID,因此不会将任何内容保存到 UserDefaults

以上是关于Swift - UserDefaults 设置未保存在框架内的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3.0:在 TableView 的 UserDefaults 中存储数组

Swift:如何检查 UserDefaults 是不是存在,如果不保存选择的标准值?

Swift UserDefaults (2017)

Swift 应用的配置管理库 Prephirences

Swift 3和UserDefaults

如何将 UserDefaults 添加到任务列表中 - Swift