変更を追跡する最良の方法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.
}
}