NSUserDefaults 不可靠?
Posted
技术标签:
【中文标题】NSUserDefaults 不可靠?【英文标题】:NSUserDefaults unreliable? 【发布时间】:2016-04-13 08:33:58 【问题描述】:我正在使用 NSUserDefaults 在我的应用程序中存储键/值对。下面是示例代码:
override func viewDidAppear(animated: Bool)
super.viewDidAppear(animated)
let ud = NSUserDefaults.standardUserDefaults()
if !(ud.boolForKey("launched_before"))
print("first_launch")
ud.setBool(true, forKey: "launched_before")
else
print("not_first_launch")
第一次启动应用程序时,它会按预期打印“first_launch”,第二次启动应用程序时,它也会按预期打印“not_first_launch”。但是,如果我在几次(可能 4 到 20 次)后按 Xcode 中的停止和运行按钮继续重新启动应用程序,boolForKey("launched_before")
将返回 false,这是错误的。
我正在我的设备(iPhone 6、ios 9.3.1)和 Xcode 7.3 上进行测试。
谁能帮帮我?
【问题讨论】:
【参考方案1】:NSUserDefaults 确实保存不可靠,更糟糕的是您只是通过 Xcode 停止/运行来终止它。
调用NSUserDefaults.StandardUserDefaults().synchronize
将保存数据。
【讨论】:
但是怎么第二次就按预期工作了,也就是说设置boolean是成功的吧? 这将帮助您了解 NSUserDefault 它是如何工作的:accella.net/knowledgebase/… @SuhasPatil 感谢您的链接,但它没有解决我的问题,为什么它在我第二次运行它时运行良好,但在后续运行中可能会失败。我不认为不调用 synchronize() 是问题的原因。因为我第二次运行它,boolForKey() 返回的是正确的 true,并且在随后的运行中保持正确,直到几次之后它突然返回 false。 是的,我明白了,我认为该值不会立即反映在内存中,除非并且直到您没有调用同步,直到那时它保留在缓存内存中,当它被清除时,相应的值是也消失了!以上是关于NSUserDefaults 不可靠?的主要内容,如果未能解决你的问题,请参考以下文章