Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

Применил решение через наблюдение за ключом:

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

Или, проще (в комментариях ниже):

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

Ответ 2

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

Ответ 4

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

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