使用suiteName检测NSUserDefaults中的更改

Dmi*_*try 10 nsuserdefaults ios swift watchkit watchos-2

在我的项目中,我使用app group将数据传输到apple watch!这看起来像这样

let sharedDefaults = NSUserDefaults(suiteName: "group.com.myappname.defaults")
sharedDefaults?.setObject(MyData, forKey: "DataKey")
sharedDefaults?.synchronize()
Run Code Online (Sandbox Code Playgroud)

在WKInterfaceController中,我使用以下代码获取数据:

let sharedDefaults = NSUserDefaults(suiteName: "group.com.myappname.defaults")
let MyData = sharedDefaults?.objectForKey("DataKey") as! [[AnyObject]]
Run Code Online (Sandbox Code Playgroud)

一切正常!

现在我尝试检测sharedDefaults中的数据?.objectForKey("DataKey")是否确实发生了变化.我尝试使用addObserver方法:

override func willActivate() {
NSUserDefaults(suiteName: "group.com.myappname.defaults")!.addObserver(self, forKeyPath: "DataKey", options: NSKeyValueObservingOptions.New, context: nil)
}

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>){
      print("Data Changed")
}
Run Code Online (Sandbox Code Playgroud)

但是"覆盖func observeValueForKeyPath"仅在WKInterfaceController激活时调用,并且当我在NSUserDefaults中更改数据时没有调用(suiteName:"group.com.myappname.defaults")

我也尝试使用NSNotificationCenter:

override func willActivate() {
let sharedDefaults = NSUserDefaults(suiteName: "group.com.myappname.defaults")
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(userDefaultsDidChangeNotificationMethod(_:)), name: NSUserDefaultsDidChangeNotification, object: nil)
}

func userDefaultsDidChangeNotificationMethod(notification: NSNotification){
 print("Data Changed")
}
Run Code Online (Sandbox Code Playgroud)

它不起作用(

我做错了什么?如何检测数据是否发生变化?

Dmi*_*try 2

我知道这是一个不好的方法,但我没有找到其他方法......我的方法是无限循环:

var NeedCheking = Bool()


override func willActivate() {
        super.willActivate()
        NeedChecking = true
        CheckDefaults()
}

override func didDeactivate() {
    NeedChecking = false
    super.didDeactivate()
}

func CheckDefaults(){

        let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
        dispatch_async(dispatch_get_global_queue(priority, 0)) {

        repeat {

            let sharedDefaults = NSUserDefaults(suiteName: "group.com.myappname.defaults")
            let NewData = sharedDefaults?.objectForKey("DataKey") as! [[AnyObject]]
            if NewData != self.MyData {

                dispatch_async(dispatch_get_main_queue()) {
                    self.MyData = NewData
                    //Here do update actions!
               }
            }
            sleep(2)
        }while self.NeedChecking
    }
    }
Run Code Online (Sandbox Code Playgroud)

如果有人知道其他方式,请发布您的解决方案作为此问题的答案!