web-dev-qa-db-ja.com

Cocoa-NSUserDefaults値の変更に関する通知?

NSUserDefaultsを介して対応する値が格納されたキー "" MyPreference "があるとします。

値が変更されたときに通知される方法はありますか?

それともバインディングを介して行うことができますか? (ただし、この場合は、値をUI要素にバインドする代わりに、オブジェクトに変更の通知を送信して、他のタスクを実行できるようにします。)

NSUserDefaultsDidChangeNotificationを監視できることは承知していますが、これはオールオアナッシングアプローチのようであり、変更された特定のキーと値のペアを取得するメカニズムがないようです。 (自由に修正してください。)

51
SirRatty

質問をしてから10分後に答えを探して一日中過ごしました...

Key-Value-Observingを通じてソリューションに出会った:

[[NSUserDefaultsController sharedUserDefaultsController] addObserver:self
    forKeyPath:@"values.MyPreference"
    options:NSKeyValueObservingOptionNew
    context:NULL];

または、もっと簡単に(以下のコメントごとに):

[[NSUserDefaults standardUserDefaults] addObserver:self
                                        forKeyPath:@"MyPreference"
                                           options:NSKeyValueObservingOptionNew
                                           context:NULL];
79
SirRatty

迅速:

override func viewDidLoad() {
  super.viewDidLoad()
  NSUserDefaults.standardUserDefaults().addObserver(self, forKeyPath: "THE KEY", options: NSKeyValueObservingOptions.New, context: nil)
}

override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
  // your logic
}

deinit {
  NSUserDefaults.standardUserDefaults().removeObserver(self, forKeyPath: "THE KEY")
}
19
Brian

そしてApple従業員はここでNSUserDefaultsDidChangeNotification通知を使用することを勧められました: https://devforums.Apple.com/message/237718#237718

9
DenNukem

@DenNukemに同意します。 NSKeyValueObservingOptionNewを使用していました。しかし、この関数は、他のオブジェクトを保存するためにNSUserdefaultを使用した場所にBADACCESS Code = 1エラーを出し始めました。 Key Value Observerを使用している場合は、NSUserDefaultsのゾンビの問題に注意してください。

これがソリューションへのリンクです: NSUserDefaultsおよびKVOの問題

0
Tarika Chawla