Xcode 9 模拟器不保存用户默认值

Xcode 9 simulator doesn't save userdefaults

可能与 问题相同。但是我尝试过的解决方案中有几个是行不通的。

模拟器不会在 Xcode 版本 9.0 beta 6 (9M214v) 上保存用户默认值。 我也有 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的作用以及用户默认值的编写方式存在很多误解。在猜测事情如何运作之前,请务必检查 current maintainer's commentary about it. He's pretty clear about things. His analogy to git is also somewhat useful, and see his notes about iOS 8 更改。 NSUserDefaults 改变的方式比你想象的对这样一个古老的技术来说要多得多。

总而言之,在生产应用中几乎不需要调用 synchronize。 (事实上​​ ,关于弃用和删除它的反复讨论。)正如文档所述:

Because this method is automatically invoked at periodic intervals, use this method only if you cannot wait for the automatic synchronization (for example, if your application is about to exit) or if you want to update the user defaults to what is on disk even though you have not made any changes.

即使这些案例也大多与 macOS 有关。

For applications running on iOS 9.3 and later / macOS Sierra and later, -synchronize is not needed (or recommended) even in this situation [synchronizing between processes], since Key-Value Observation of defaults works between processes now, so the reading process can just watch directly for the value to change. As a result of that, applications running on those operating systems should generally never call synchronize.

但是......

人们在模拟器中使用用户默认设置时遇到的常见问题是,他们会在写入发生之前终止应用程序(点击停止、重新启动应用程序、崩溃)。在生产中,这通常不是问题。如果你在写入用户默认值的时候崩溃了,很可能你处于一个定义不明确的状态,所以无论你写的是垃圾,还是写的好,或者什么都没写,都是一种折腾-你喜欢什么。但是在开发的时候,程序总是会终止,这往往会导致用户默认值没有写出来。

现在,一种似乎经常有效的解决方案是到处撒 synchronize。但在大多数情况下,这只会减慢您的代码速度。如果它有效,很好。但在我从事的大多数项目中,真正的解决方案只是在终止应用程序之前先喘口气。它不需要很多时间;只是不要在应用程序有机会写入您保存的内容之前终止应用程序,然后重新启动以检查它是否已保存。

对我来说,我使用的是 git
的库 此库正在删除所有 userDefaults。