也许与这个问题是同一问题。但是我尝试过的很少的解决方案不起作用。
模拟器不会在Xcode版本9.0 Beta 6(9M214V)上保存UserDefaults。我也有Xcode 8(一起使用9),但将其删除。
我正在使用的代码:
UserDefaults.standard.setValue("1234567", forKey: "phone")
if let phone = UserDefaults.standard.value(forKey: "phone") as? String{
//some code here
}
我还尝试了:
UserDefaults.standard.set("1234567", forKey: "phone")
if let phone = UserDefaults.standard.object(forKey: "phone") as? String{
//some code here
}
关于synchronize
的作用以及用户默认如何编写的误解。在猜测事情的工作原理之前,请务必检查当前的维护者对此的评论。他对事情很清楚。他对git的比喻也有些有用,并看到了他关于iOS 8变化的笔记。NsuserDefaults的变化超出了您认为的旧技术的想法。
简短的是,在生产应用程序中几乎不需要调用synchronize
。(实际上,有关于折旧和删除的经常讨论。)如文档所述:
因为此方法是在定期间隔自动调用磁盘即使您没有进行任何更改。
,甚至这些情况主要与MacOS有关。
对于在iOS 9.3及以后的/macOS sierra上运行的应用程序以及以后的应用程序,即使在这种情况下(过程之间同步),也不需要(或推荐) - 由于现在之间的键值观察在过程之间工作,因此阅读过程只能直接观看要更改的值。因此,在这些操作系统上运行的应用程序通常绝不应调用同步。
但是.....
人们在模拟器中对用户默认值遇到的通常问题是,他们在写入之前杀死了应用程序(击中停止,重新启动应用程序,崩溃)。在生产中,这通常不是问题。如果您在写信给用户默认值时就崩溃了,那么无论如何,您的定义状态很差,因此无论您是写垃圾还是写东西,或者不写任何东西, - 您喜欢的东西。但是,在开发时,程序终止一直在发生,并且通常会导致不写出用户默认值。
现在,一个经常工作的解决方案是在整个地方撒上synchronize
。但是在大多数情况下,只会减慢您的代码。如果有效,很好。但是,在我从事的大多数项目中,真正的解决方案只是在杀死该应用程序之前呼吸。它不需要很多时间;只是在重新启动之前写下您要保存的东西之前,不要杀死该应用程序是否保存。
对我来说,我正在使用git
的库该库正在删除所有UserDefaults。
如此答案所述