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

时间:2017-10-02 13:29:37

标签: ios xcode ios11 xcode9

也许与this问题相同。但是我尝试过的解决方案很少有用。

模拟器不会在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
} 

2 个答案:

答案 0 :(得分:3)

关于synchronize做什么以及如何编写用户默认值,存在很多误解。在猜测事情是如何运作之前,请务必查看current maintainer's commentary。他对事情很清楚。他的analogy to git也有些用处,并看到他关于iOS 8变化的说明。 NSUserDefaults改变的方式比你想象的那样一个旧的技术。

短期和长期是在生产应用程序中几乎不需要调用synchronize。 (事实上​​,有关弃用和删除它的反复讨论。)正如文档所述:

  

因为此方法是定期自动调用的,所以只有在您不能等待自动同步时(例如,如果您的应用程序即将退出)或者您希望将用户默认值更新为打开时,才使用此方法即使您没有进行任何更改,也可以使用磁盘。

甚至那些案例大多与macOS有关。

  

对于在iOS 9.3及更高版本/ macOS Sierra及更高版本上运行的应用程序,即使在这种情况下[在进程之间进行同步]也不需要(或推荐)-synchronize,因为默认值的键值观察现在在进程之间起作用,所以阅读过程可以直接观察价值变化。因此,在这些操作系统上运行的应用程序通常不应调用同步。

BUT .....

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

现在,一个经常看似工作的解决方案就是在所有地方撒上synchronize。但在大多数情况下,只会减慢代码速度。如果它工作,很好。但在我参与的大多数项目中,真正的解决方案就是在杀死应用程序之前先吸一口气。它不需要很多时间;只是在它重新启动之前有机会写下你正在保存的东西之前不要杀死它,以检查它是否已保存。

答案 1 :(得分:0)

对我来说,我正在使用git中的库
该库正在删除所有userDefaults。
AWS Configuration