And*_*ino 12 save nsuserdefaults ios swift
我正在尝试使用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()
}
}
Run Code Online (Sandbox Code Playgroud)
为什么不起作用?这段代码有什么问题?
编辑:问题是,当我尝试从中检索"isOffline"密钥时,UserDefaults我总是得到一个false.
编辑2:我在行的.onChange方法中设置了isOffline(我使用Eureka作为框架来创建表单).该标志在应用程序的生命周期中保持正确的值,但是当我关闭它时,该值可能会以某种方式被删除.
小智 21
我有同样的问题,问题出在"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")
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果有人可以解释,为什么它在主线程上运行而不是其他,我会很高兴听到它.
尝试改变
UserDefaults.standard.set(isOffline, forKey: "isOffline")
Run Code Online (Sandbox Code Playgroud)
到
UserDefaults.standard.setValue(isOffline, forKey: "isOffline")
Run Code Online (Sandbox Code Playgroud)
没有发货代码
这样做,
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()
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8853 次 |
| 最近记录: |