如何删除所有UserDefaults数据? - 斯威夫特

Ziz*_*zoo 30 nsuserdefaults ios swift

我有这个代码UserDefaults从应用程序中删除所有数据:

let domain = Bundle.main.bundleIdentifier!
UserDefaults.standard.removePersistentDomain(forName: domain)

print(Array(UserDefaults.standard.dictionaryRepresentation().keys).count)
Run Code Online (Sandbox Code Playgroud)

但是我10从印刷线上得到了.不应该0吗?

Lef*_*ris 66

问题是您在清除UserDefaults内容后立即打印它们,但您没有手动同步它们.

let domain = Bundle.main.bundleIdentifier!
UserDefaults.standard.removePersistentDomain(forName: domain)
UserDefaults.standard.synchronize()
print(Array(UserDefaults.standard.dictionaryRepresentation().keys).count)
Run Code Online (Sandbox Code Playgroud)

这应该可以解决问题.

现在您通常不需要synchronize手动调用,因为系统会定期自动同步userDefaults,但如果您需要立即推送更改,则需要通过synchronize调用强制更新.

文档说明了这一点

因为此方法是定期自动调用的,所以只有在您无法等待自动同步时(例如,如果您的应用程序即将退出)或者您希望将用户默认值更新为磁盘上的内容,请使用此方法你没有做任何改变.

  • 您应该将答案更新为实际回答问题的内容,而不是使用同步的建议。 (2认同)
  • 无需强制同步,也无需创建新的数组对象即可获取键计数`UserDefaults.standard.dictionaryRepresentation()。keys.count` (2认同)

Rya*_*los 30

这个答案在这里找到/sf/answers/475799341/,但只是在这里它是在Swift.

func resetDefaults() {
    let defaults = UserDefaults.standard
    let dictionary = defaults.dictionaryRepresentation()
    dictionary.keys.forEach { key in
        defaults.removeObject(forKey: key)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 或者更好:`defaults.dictionaryRepresentation().keys.forEach(defaults.removeObject(forKey:)` (4认同)
  • 从关于syncrhonize()函数的官方文档:"此方法是不必要的,不应该使用" (2认同)