我正在尝试使用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
。
编辑2: 我在行的.onChange方法中设置了isOffline(我使用Eureka作为框架来创建表单)。该标志在应用程序的生命周期中保持正确的值,但是当我关闭它时,该值可能会以某种方式被删除。
答案 0 :(得分:19)
我遇到了同样的问题,问题出现在" didSet"阻止自己。我不知道为什么,但它不适用于userDefaults - 它没有正确地保留它并且在杀死应用程序后所有更改都消失了。
Synchronize()没有帮助。我发现,这种方法不再需要了,将来会被弃用(这是UserDefaults类中的注释):
不推荐使用-synchronize,并且将来的版本中将使用NS_DEPRECATED宏进行标记。
通过反复试验,我发现,如果我从主线程调用它,它就可以了:
{{1}}
如果有人可以解释,为什么它可以在主线程上运行而不是其他,我会很高兴听到它。
答案 1 :(得分:2)
这样做,
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()
}
}
答案 2 :(得分:0)
尝试更改
UserDefaults.standard.set(isOffline, forKey: "isOffline")
到
UserDefaults.standard.setValue(isOffline, forKey: "isOffline")
没有调度代码