ios UserDefaults不使用Swift保存

at0kjp5o  于 2023-03-24  发布在  iOS
关注(0)|答案(4)|浏览(171)

我尝试使用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 作为框架来创建表单)。该标志在应用的生命周期中保持正确的值,但当我关闭它时,该值可能会以某种方式被删除。

f0ofjuux

f0ofjuux1#

我也遇到了同样的问题,问题出在“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")
        }
    }
}

如果有人能解释一下,为什么它只在主线程上工作,而不是其他线程,我很乐意听到。

nhn9ugyo

nhn9ugyo2#

试图改变

UserDefaults.standard.set(isOffline, forKey: "isOffline")

UserDefaults.standard.setValue(isOffline, forKey: "isOffline")

没有调度代码

ngynwnxp

ngynwnxp3#

这样做,

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()
    }
}
5kgi1eie

5kgi1eie4#

不要问我为什么,但我在Xcode 14的一个项目中也遇到了这个问题。
经过几个小时的调试,我意识到我的密钥的长度超过了18个字符,它将不再被保存。然而,我不能在一个香草项目中重现这一点,所以我猜这与项目有关。
但无论如何:如果您遇到这种情况,请尝试减少键的字符数。

相关问题