使用suiteName检测NSUserDefaults上的更改

时间:2014-10-28 01:21:05

标签: ios swift nsuserdefaults

我创建了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(),它会按预期工作。 知道为什么它不能正常工作吗?

2 个答案:

答案 0 :(得分:1)

针对macOS 10.12和iOS 10的基金会发行说明

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

  

键值观察和NSUserDefaults

     

在以前的版本中,只能在+ standardUserDefaults方法返回的NSUserDefaults实例上使用KVO。此外,KVO忽略了来自其他进程的更改(例如defaults(1),扩展名或应用程序组中的其他应用程序)。这些限制都已得到纠正。来自其他进程的更改将在主队列上异步传递,并且忽略NSKeyValueObservingOptionPrior。

答案 1 :(得分:0)

尝试添加suitename而不是初始化。如果要共享数据,请设置应用程序组

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