用户默认值不随Swift 3一起保存

时间:2016-12-23 13:02:51

标签: 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, forKey: "isOffline")
            UserDefaults.standard.synchronize()
        }
    }

为什么不起作用?这段代码有什么问题?

编辑: 问题是,当我尝试从"isOffline"检索UserDefaults密钥时,我总是得到false

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

3 个答案:

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

没有调度代码