是否有可能无法读取UserDefaults.standard值?

时间:2017-05-21 01:28:30

标签: ios iphone swift ipad nsuserdefaults

我知道UserDefaults只是为了保存首选项,但这些首选项是持久的 - UserDefaults中保存的值是在无限数量的应用程序启动时维护的,并且只要应用程序仍然安装就可以读取。对吧?

是否可能会清除这些值或在任何时候无法正确访问这些值?经过多年使用UserDefaults并依赖于它们所持有的值的一致性,我现在已经在一天的工作中看到过两次,当我的应用程序启动并检查一个简单的布尔值时,该值不正确。

if defaults.bool(forKey: "beenLaunched") {

每次应用启动时都会运行此代码。如果值为true,我什么都不做,但是如果它是假的,我设置了一些值,因为这是用户首次启动应用程序然后我调用defaults.set(true,forKey:& #34;已发布")和defaults.set(0,forKey:" eventsCompleted")和其他一些值。

我发现this thread on the Apple forums其中Eskimo说"对于中央NSUserDefaults方法,-objectForKey :,结果为nil意味着该值不可用,但是没有办法区分这个键不是当前,并且无法获取此值,因为用户默认值处于脱机状态。" (这似乎是针对background launching while a device is locked

的具体情况

我可以研究一种更安全的方法来保存简单数据,例如Bool值,Int或String,但是对这些类型的值使用UserDefaults一直都很简单,直接且可靠。任何人都可以对这个问题感兴趣,如果我错误地相信UserDefaults'持久性?

谢谢!

2 个答案:

答案 0 :(得分:4)

UserDefaults不是"服务&#34 ;;它永远不适用于您的应用程序。它写入的文件是PLIST(因此所有值都根据PLIST标准存储)。例如,所有数字(包括布尔值)都存储为文件NSNumber,可以object(forKey:)bool(forKey:)检索。如果您使用object方法并且没有为该值设置任何内容,则会得到nil,其布尔值为false(或0)。如果使用布尔方法(获得false),则相同。这意味着无论你走哪条路,如果没有价值或false的价值,你总会得到假。设计你的逻辑(你已经拥有 - "beenLaunched"将为空,因此false如果它从未被启动过)你应该没事。

关于synchronize()的建议,请忽略它。除非您使用线程和首选项访问做了一些非常奇怪的事情,否则您在设置问题键的值/对象后立即中断了应用程序,它与此无关。根据文档的第一段,根据需要定期调用synchronize()。在实践中,它在变化发生后几乎立即被调用。

对于上下文,我的应用程序都没有调用synchronize(),其中一些应用程序已经足够老了。从来没有一个问题。如果您没有非常好的理由自己致电synchronize(),那么您几乎肯定不需要它,并尝试解释为什么您需要将其洒在各处...经常很有趣。

在您的特定情况下,首次运行多次后停留的值突然没有一次。您是否可以更改应用程序的软件包标识符或名称?默认值由标识符+名称存储,因此更改将有效地"重置"您应用的默认设置。你是否在模拟器中运行你的应用程序,你只是在模拟器中重置内容和设置?在您的设备上删除应用程序,然后在设备上重新运行它?

答案 1 :(得分:-1)

如果你在swift工作,那么返回nil意味着objectforkey根本没有分配任何值。在其他情况下,如果您正确地输出了保存的值,它总是返回正确的值。

并且userdefaults始终可供使用,它永远不会脱机。