Ios 用户默认值未与Swift 3一起保存

Ios 用户默认值未与Swift 3一起保存,ios,swift,save,nsuserdefaults,Ios,Swift,Save,Nsuserdefaults,我试图使用UserDefaults持久保存布尔值。这是我的代码: public static var isOffline = UserDefaults.standard.bool(forKey: "isOffline") { didSet { print("Saving isOffline flag which is now \(isOffline)") UserDefaults.standard.set(isOffline, fo

我试图使用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

编辑2: 我在行的.onChange方法中设置了Isofline(我使用Eureka作为框架来创建表单)。该标志在应用程序的生命周期中保持正确的值,但当我关闭它时,该值可能会以某种方式被删除

像这样做

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

我也有同样的问题,问题出在“didSet”块本身。我不知道为什么,但它不能与userDefaults一起工作-它不能正确地保持它,并且在终止应用程序后,所有更改都消失了

Synchronize()没有帮助。我发现,这个方法不再是必需的,将来它将被弃用(这是UserDefaults类中的注释):

-synchronize已弃用,并将在将来的版本中使用NS\U弃用宏进行标记

通过反复试验,我发现它是有效的,如果我从主线程调用它:

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")


如果没有调度代码

,您的代码以何种方式不起作用?请向我们展示一个。另请注意,您无需每次更改用户默认值时调用
synchronize()
——仅当您特别需要系统立即保存用户默认值时(例如,当您的应用程序即将终止时)——请参阅。是的,您是对的。但现在的问题是,“isOffline”标志总是返回false如何以及在何处设置
isOffline
?@Hamish我添加了更多详细信息第一个示例不起作用,因为您绑定的所谓“
newValue
”实际上是属性的旧值。但这两个例子都没有回答OP的问题“这段代码中有什么问题?”。第一个例子同样有效。我亲自测试,然后只有我发布。我已经挣扎和调试了几天。。。如果你看一下函数描述的话,它所需要的就是.synchronizehover:“等待对默认数据库的任何挂起的异步更新并返回;这个方法是不必要的,不应该使用。”“在运行时,您可以使用UserDefaults对象从用户的默认数据库中读取应用程序使用的默认值。UserDefaults缓存信息,以避免每次需要默认值时都必须打开用户的默认数据库。设置默认值时,它会在进程内同步更改,并异步更改为永久性存储和其他进程。“这可能是因为缓存,而在主线程上进行更改可能是默认值被即时写入的原因。您知道为什么设置()函数不起作用?因为它在我的设备上似乎是随机的。有时它起作用,有时它对一些值起作用。有时它不起作用。奇怪的是。有时我存储值,然后加载它们,什么也得不到。然后我重新启动应用程序,突然一些值又回来了。有了setValue,这些问题看起来就消失了是的。但我真的很想知道为什么!:)对不起,我不知道原因,因为我很高兴它能为我们大家工作
UserDefaults.standard.setValue(isOffline, forKey: "isOffline")