我希望我的 Cocoa Objective-C 应用程序能够观察 NSUserDefaults 更改,这些更改是命令行调用默认写入的结果,例如:
defaults write <domain> <key> -array val1 val2 val3
我已经列举了许多有关观察 NSUserDefaults 更改的示例。看起来通知已经消失了,因为它们只在同一进程中工作。为了观察命令行的变化,我认为需要 KVO。
在我见过的 KVO 示例中,我不清楚如何将“defaults write ...”命令行调用中使用的“domain”和“key”参数关联到所使用的 KVO 逻辑的编程结构观察这些变化。
如果有一个简洁、具体的可运行示例,其中包含代码和相关的“defaults write ...”命令,我们将不胜感激!
最佳答案
这就像 KVO 对默认值进行任何其他更改一样。
假设您的应用的 CFBundleIdentifier
为 your.company.app,并且您希望使用键 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 应用模板、来自 AppDelegate 的 KVO 进行测试)
关于objective-c - 如何在 Objective-C 应用程序中观察 NSUserDefaults 的命令行更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54374090/