如何在Objective-C应用程序中观察命令行对NSUserDefaults的更改?

时间:2019-01-25 23:20:59

标签: objective-c macos cocoa nsuserdefaults key-value-observing

我希望我的Cocoa Objective-C应用程序能够观察到NSUserDefaults的更改,这些更改是由于命令行调用默认值而导致的,例如:

defaults write <domain> <key> -array val1 val2 val3

我已经举了很多有关观察NSUserDefaults更改的示例。似乎发出通知是因为通知仅在同一过程中起作用。为了观察命令行的变化,我相信需要KVO。

在我看到的KVO示例中,我不清楚如何将“默认写...”命令行调用中使用的“域”和“键”自变量与所使用的KVO逻辑的程序结构相关联观察这些变化。

一个简洁,具体的可运行示例,其中包含代码和关联的“ defaults write ...”命令,将不胜感激!

1 个答案:

答案 0 :(得分:2)

就像将其他更改更改为默认值一样。

假设您的应用具有 your.company.app CFBundleIdentifier,并且您想使用键 foo KVO设置默认值。

设置 foo 的KVO就像这样:

[NSUserDefaults.standardUserDefaults addObserver:self forKeyPath:@"foo" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];

,并且在同一类中有一个KVO回调方法:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
    // just for debugging:
    NSLog(@"KVO: keyPath = '%@', change = %@", keyPath, change);
}

构建并运行该应用;然后在命令行上发出:

defaults write your.company.app foo "bar"

应导致调用KVO回调方法(已使用macOS 13,XCode9,沙盒默认macOS Cocoa App模板进行了测试,并通过AppDelegate进行了KVOing操作)