我尝试使用UserDefaults来持久保存一个布尔值。这是我的代码:
public static var isOffline = UserDefaults.standard.bool(forKey: "isOffline") {
didSet {
print("Saving isOffline flag which is now \(isOffline)")
UserDefaults.standard.set(isOffline, forKey: "isOffline")
UserDefaults.standard.synchronize()
}
}
为什么不起作用?这段代码有什么问题?
问题是,当我试图从UserDefaults
中检索"isOffline"
密钥时,我总是得到一个false
。
我在该行的.onChange方法中设置了isOffline(我使用Eureka 作为框架来创建表单)。该标志在应用的生命周期中保持正确的值,但当我关闭它时,该值可能会以某种方式被删除。
4条答案
按热度按时间f0ofjuux1#
我也遇到了同样的问题,问题出在“didSet”块本身。我不知道为什么,但它不能与userDefaults一起工作-它不能正确地持久化它,并且在杀死应用程序后,所有更改都消失了。
Synchronize()没有帮助。我发现,这个方法不再是必要的,它将在未来被弃用(这是UserDefaults类中的注解):
-synchronize已弃用,并将在未来版本中使用NS_DEPRECATED宏进行标记。
通过试验和错误,我发现,它的工作原理,如果我从主线程调用它:
如果有人能解释一下,为什么它只在主线程上工作,而不是其他线程,我很乐意听到。
nhn9ugyo2#
试图改变
到
没有调度代码
ngynwnxp3#
这样做,
5kgi1eie4#
不要问我为什么,但我在Xcode 14的一个项目中也遇到了这个问题。
经过几个小时的调试,我意识到我的密钥的长度超过了18个字符,它将不再被保存。然而,我不能在一个香草项目中重现这一点,所以我猜这与项目有关。
但无论如何:如果您遇到这种情况,请尝试减少键的字符数。