Cocoa-уведомление об изменении значения NSUserDefaults?


допустим, у меня есть ключ @"MyPreference", с соответствующим значением, хранящимся через NSUserDefaults.

есть ли способ получать уведомления при изменении значения?

или это можно сделать через привязку? (Но в этом случае вместо привязки значения к элементу пользовательского интерфейса я хочу, чтобы мой объект был уведомлен об изменении, чтобы я мог выполнять другие задачи.)

Я знаю, что NSUserDefaultsDidChangeNotification можно наблюдать, но это, кажется, a подход "все или ничего", и там, похоже, нет механизма для получения конкретной пары ключ-значение, которая была изменена. (Не стесняйтесь исправлять.)

4   51   2009-07-17 07:58:40

4 ответа:

провел весь день в поисках ответа, только чтобы найти его через 10 минут после того, как задал вопрос...

наткнулся на решение через ключ-значение наблюдений:

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

или, проще говоря (за комментарий ниже):

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

Swift:

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")
}

и сотрудник Apple посоветовал использовать уведомление NSUserDefaultsDidChangeNotification здесь:https://devforums.apple.com/message/237718#237718

Я согласен с @DenNukem. Я использовал NSKeyValueObservingOptionNew. Но эта функция начала давать мне ошибку BADACCESS Code=1 везде, где я использовал NSUserdefault для сохранения других объектов. В случае, если вы используете Key Value Observer, просто знайте о проблеме зомби на NSUserDefaults.

вот ссылка на решение: проблемы NSUserDefaults и KVO