Обнаруживать изменения в NSUserDefaults с именем packageName

Я создал appGroups и настроил NSUserDefaults, используя эту группу. У меня есть наблюдатель, для которого не срабатывает при изменении значения.

let defaults = NSUserDefaults(suiteName: "group.daniesy.text")!            
defaults.addObserver(self, forKeyPath: "temp", options: NSKeyValueObservingOptions.New, context: nil)
defaults.setBool(!defaults.boolForKey("temp"), forKey: "temp")
defaults.synchronize()

override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
    println("changed")
}

Однако, если я игнорирую appGroup и использую NSUserDefaults.standardUserDefaults(), он работает как положено. Есть идеи, почему это не работает?

Ответ 1

Попробуйте добавить имя пользователя вместо инициализации. Настройте группу приложений, если вы хотите поделиться данными

let defaults = NSUserDefaults.standardUserDefaults()
defaults.addSuiteNamed("group.daniesy.text")
defaults.addObserver(self, forKeyPath: "temp", options: NSKeyValueObservingOptions.New, context: nil)
defaults.setBool(!defaults.boolForKey("temp"), forKey: "temp")
defaults.synchronize()

override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
    println("changed")
}

Ответ 2

Замечания по выпуску Foundation для MacOS 10.12 и iOS 10

https://developer.apple.com/library/archive/releasenotes/Miscellaneous/RN-Foundation-OSX10.12/index.html

Наблюдение значения ключа и NSUserDefaults

В предыдущих выпусках KVO можно было использовать только для экземпляра NSUserDefaults, возвращенного методом +standardUserDefaults. Кроме того, KVO игнорировала изменения других процессов (таких как настройки по умолчанию (1), расширения или другие приложения в группе приложений). Эти ограничения были оба исправлены. Изменения из других процессов будут доставляться асинхронно в основную очередь и игнорировать NSKeyValueObservingOptionPrior.