跟踪更改的最佳方法NSUserDefaults
是使用 KVO 添加观察者。这样,您无需手动执行任何自定义通知代码或跟踪更改。
在想要了解更改的类中,只需将其注册为指定键的侦听器:
[[NSUserDefaults standardUserDefaults] addObserver:self forKeyPath:@"blackKey" options:NSKeyValueObservingOptionNew context:nil];
[[NSUserDefaults standardUserDefaults] addObserver:self forKeyPath:@"greenKey" options:NSKeyValueObservingOptionNew context:nil];
然后只需响应通知:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if (object == defaults) {
// Here you can grab the values or just respond to it with an action.
}
}
现在,只要其中一个键发生更改,您就会自动收到通知。
这是一个超级干净的解决方案,允许大量重复使用。例如,如果您将NSKeyValueObservingOptionInitial
键添加到options
上面的参数 ( NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew
) 中,那么它也会将初始值通知您的观察者方法,即使对于初始状态,您也可以重用该方法。
斯威夫特版本
设置默认值:
NSUserDefaults.standardUserDefaults().addObserver(self, forKeyPath: "blackKey", options: .New, context: nil)
NSUserDefaults.standardUserDefaults().addObserver(self, forKeyPath: "greenKey", options: .New, context: nil)
观察者:
override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
if object is NSUserDefaults {
// Here you can grab the values or just respond to it with an action.
}
}