我希望我的Cocoa Objective-C应用程序能够观察到NSUserDefaults的更改,这些更改是由于命令行调用默认值而导致的,例如:
defaults write <domain> <key> -array val1 val2 val3
我已经举了很多有关观察NSUserDefaults更改的示例。似乎发出通知是因为通知仅在同一过程中起作用。为了观察命令行的变化,我相信需要KVO。
在我看到的KVO示例中,我不清楚如何将“默认写...”命令行调用中使用的“域”和“键”自变量与所使用的KVO逻辑的程序结构相关联观察这些变化。
一个简洁,具体的可运行示例,其中包含代码和关联的“ defaults write ...”命令,将不胜感激!
答案 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操作)