如何以编程方式从NSGlobalDomain中删除首选项?

时间:2016-05-01 15:08:46

标签: swift macos cocoa nsuserdefaults

这是终端的一项简单任务:

defaults delete -g <key>

我想使用NSUserDefaults在Swift中执行此操作。 documentation说:

  

如果要更改全局域中首选项的值,请使用新值将相同的首选项写入应用程序域。

这只是为应用程序域中的相同密钥设置一个新值,以便当NSUserDefaults在将来检索密钥的值时,它将在应用程序域在搜索全局域之前。

有没有办法:

  1. 从NSGlobalDomain中删除密钥,或
  2. 在NSGlobalDomain
  3. 中为密钥设置新值

    使用NSUserDefaults

    我知道我可以使用NSTask来运行defaults delete -g <key>,但我认为这是一种解决方法(有效的)。

1 个答案:

答案 0 :(得分:3)

你可以试试这个,但这不是一个好主意:

var defaults = NSUserDefaults.standardUserDefaults()
var globalDomain = defaults.persistentDomainForName(NSGlobalDomain)
globalDomain.removeObjectForKey(someKey)
defaults.setPersistentDomain(globalDomain, forName:NSGlobalDomain)

主要问题是与其他进程或线程的竞争条件。如果某些内容在您阅读它和将其写回的时间之间更改了全局域,则撤消这些更改,即使它们不涉及您正在操作的键。此外,你可能正在阅读和编写一本大型字典,做的工作比实际需要的要多得多。

可能最好下拉到CFPreferences API:

CFPreferencesSetValue(someKey, nil, kCFPreferencesAnyApplication,
                      kCFPreferencesCurrentUser, kCFPreferencesCurrentHost)