我正在尝试使用 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()
}
}
为什么不起作用?这段代码有什么问题?
问题是,当我尝试从
"isOffline"
检索 UserDefaults
密钥时,我总是得到 false
。
我在行的 .onChange 方法中设置了 isOffline (我使用 Eureka 作为创建表单的框架)。该标志在应用程序的生命周期中保持正确的值,但是当我关闭它时,该值可能会以某种方式被删除。
我遇到了同样的问题,问题出在“didSet”块本身。我不知道为什么,但它不适用于 userDefaults - 它无法正确保留它,并且在终止应用程序后所有更改都消失了。
Synchronize() 没有帮助。我发现,这个方法不再需要,并且将来会被弃用(这是 UserDefaults 类中的注释):
-synchronize 已弃用,并将在未来版本中用 NS_DEPRECATED 宏进行标记。
通过反复试验,我发现,如果我从主线程调用它,它是有效的:
public static var isOffline = UserDefaults.standard.bool(forKey: "isOffline") {
didSet {
print("Saving isOffline flag which is now \(isOffline)")
DispatchQueue.main.async {
UserDefaults.standard.set(isOffline, forKey: "isOffline")
}
}
}
如果有人可以解释为什么它在主线程上工作而不是在其他线程上工作,我会很高兴听到它。
尝试改变
UserDefaults.standard.set(isOffline, forKey: "isOffline")
到
UserDefaults.standard.setValue(isOffline, forKey: "isOffline")
没有发货代码
这样做,
public static var isOffline:Bool {
get {
return UserDefaults.standard.bool(forKey: "isOffline")
}
set(newValue) {
print("Saving isOffline flag which is now \(isOffline)")
UserDefaults.standard.set(newValue, forKey: "isOffline")
UserDefaults.standard.synchronize()
}
}
不要问我为什么,但我在 Xcode 14 的项目中也遇到了这个问题。
经过几个小时的调试,我意识到我的密钥长度超过了 18 个字符,它将不再被保存。但是,我无法在普通项目中重现这一点,所以我想这与该项目有关。
但无论如何:如果您遇到这种情况,请尝试减少密钥的字符数。
遇到了同样的问题,并意识到混合有大写和小写字符且带有下划线的键无法保存。删除下划线有效。全部大写并带有下划线的键可以正常工作。包含句点的按键不起作用。很奇怪,但如果你遇到困难,值得一试。