Cocoa - Уведомление об изменении значения NSUserDefaults?
Скажем, у меня есть ключ @MyPreference, с соответствующим значением, хранящимся в NSUserDefaults.
Есть ли способ уведомления при изменении значения?
Или это можно сделать с помощью привязок? (Но в этом случае вместо привязки значения к элементу пользовательского интерфейса я хочу, чтобы мой объект был уведомлен об изменении, чтобы я мог выполнять другие задачи.)
Я знаю, что NSUserDefaultsDidChangeNotification может быть Observed, но это похоже на подход "все или ничего", и, похоже, нет механизма для получения определенной пары ключ-значение, которая была изменена. (Не стесняйтесь исправить.)
Ответы
Ответ 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")
}
Ответ 3
И сотрудник Apple посоветовал использовать уведомление NSUserDefaultsDidChangeNotification здесь: https://devforums.apple.com/message/237718#237718
Ответ 4
Я согласен с @DenNukem. Я использовал NSKeyValueObservingOptionNew. Но эта функция начала давать мне ошибку BADACCESS Code = 1 везде, где я использовал NSUserdefault, чтобы сохранить другие объекты. Если вы используете Key Value Observer, просто знайте о проблеме Zombie в NSUserDefaults.
Вот ссылка на решение:
Проблемы с NSUserDefaults и KVO