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

dro*_*ang 2 macos cocoa nsuserdefaults swift

这是来自终端的简单任务:

defaults delete -g <key>
Run Code Online (Sandbox Code Playgroud)

我想在 Swift 中使用NSUserDefaults. 该文件说:

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

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

有没有办法:

  1. 从 NSGlobalDomain 中删除密钥,或
  2. 为 NSGlobalDomain 中的键设置一个新值

使用NSUserDefaults?

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

Ken*_*ses 5

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

var defaults = NSUserDefaults.standardUserDefaults()
var globalDomain = defaults.persistentDomainForName(NSGlobalDomain)
globalDomain.removeObjectForKey(someKey)
defaults.setPersistentDomain(globalDomain, forName:NSGlobalDomain)
Run Code Online (Sandbox Code Playgroud)

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

下降到CFPreferencesAPI可能更好:

CFPreferencesSetValue(someKey, nil, kCFPreferencesAnyApplication,
                      kCFPreferencesCurrentUser, kCFPreferencesCurrentHost)
Run Code Online (Sandbox Code Playgroud)