【问题标题】:How to observe command line changes to NSUserDefaults in Objective-C app?如何在 Objective-C 应用程序中观察 NSUserDefaults 的命令行更改?
【发布时间】:2019-01-25 23:20:58
【问题描述】:

我希望我的 Cocoa Objective-C 应用程序观察 NSUserDefaults 更改,这些更改是命令行调用默认值写入的结果,例如:

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

我列举了很多关于观察 NSUserDefaults 变化的例子。看起来通知已经出来了,因为它们只在同一个进程中工作。观察命令行变化,我认为需要KVO。

在我看到的 KVO 示例中,我不清楚如何将“defaults write ...”命令行调用中使用的“domain”和“key”参数与使用的 KVO 逻辑的编程结构相关联观察这些变化。

非常感谢您提供包含代码和相关“defaults write ...”命令的简洁、具体的可运行示例!

【问题讨论】:

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


    【解决方案1】:

    这就像 KVO 对默认值的任何其他更改。

    假设您的应用具有 your.company.appCFBundleIdentifier,并且您希望使用键 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 进行测试)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多