UserDefaults removeObjectForKey 不起作用?

Posted

技术标签:

【中文标题】UserDefaults removeObjectForKey 不起作用?【英文标题】:UserDefaults removeObjectForKey not working? 【发布时间】:2018-05-19 11:04:49 【问题描述】:

我在一开始就在我的应用程序中设置了一些用户默认值。然后这些值可能会被用户覆盖,我想删除这些设置。

当我尝试删除所有默认值时,删除了一些键值,但没有立即删除一些键。当我杀死应用程序并再次返回应用程序时,它就像已删除一样工作。正如我所料,它应该在删除键后立即工作

这是我在 swift 3.2 中设置默认值的代码

let sharedUserDefaultsWithExtension = UserDefaults(suiteName: "GROUP_IDENTIFIER")
sharedUserDefaultsWithExtension?.setValue(newValue, forKey: "My_Key")
sharedUserDefaultsWithExtension?.synchronize()

删除所有用户默认值的代码

let sharedUserDefaultsWithExtension = UserDefaults(suiteName: "GROUP_IDENTIFIER")
for key in (sharedUserDefaultsWithExtension?.dictionaryRepresentation().keys)! 
    sharedUserDefaultsWithExtension?.removeObject(forKey: key)

sharedUserDefaultsWithExtension?.synchronize()

有什么想法吗?

【问题讨论】:

【参考方案1】:

如果您想删除 userdefault 中的所有数据,请使用:

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

对于set,用户默认的数据:

UserDefaults.standard.setValue("jogendar", forKey: "My_Key")

按照您的方式,您需要在删除后同步数据,但不要尝试synchronize(),如 doc https://developer.apple.com/documentation/foundation/userdefaults/1414005-synchronize 中提到的那样

synchronize() :- 等待对默认数据库的任何挂起的异步更新并返回;这种方法是不必要的,不应该使用。

let sharedUserDefaultsWithExtension = UserDefaults(suiteName: "GROUP_IDENTIFIER")
for key in (sharedUserDefaultsWithExtension?.dictionaryRepresentation().keys)! 
    sharedUserDefaultsWithExtension?.removeObject(forKey: key)
    sharedUserDefaultsWithExtension?.synchronize()

【讨论】:

.synchronize() 现在已过时,如文档中所述。应该使用 UserDefaults 从任何代码中删除它。 @Moritz:谢谢,是的,应该删除

以上是关于UserDefaults removeObjectForKey 不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 8:类型“UserDefaults”没有成员“标准”

UserDefaults - 使用 Xcode Simulator 时保存不一致

UserDefaults with Struct - TableView 不显示从 UserDefaults 保存的数据?

UserDefaults 状态不刷新

如何从 UserDefaults 向数组添加值?

我必须使用标准共享 UserDefaults 对象吗?