- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在我的项目中,我使用应用程序组将数据传输到 Apple Watch!这看起来像这样
let sharedDefaults = NSUserDefaults(suiteName: "group.com.myappname.defaults")
sharedDefaults?.setObject(MyData, forKey: "DataKey")
sharedDefaults?.synchronize()
在 WKInterfaceController 中,我使用以下代码获取数据:
let sharedDefaults = NSUserDefaults(suiteName: "group.com.myappname.defaults")
let MyData = sharedDefaults?.objectForKey("DataKey") as! [[AnyObject]]
一切正常!
现在我尝试检测 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")
}
但是“override 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")
}
没用(
我做错了什么?如何检测数据是否发生变化?
最佳答案
我知道这是一个不好的方法,但我没有找到任何其他方法......我的方式是无限循环:
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
}
}
如果有人知道其他方法,请发布您的解决方案作为此问题的答案!
关于ios - 使用 suiteName 检测 NSUserDefaults 中的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38598016/
我试图掌握某种单元测试,所以我们创建了模拟用户默认设置。 class MockUserDefaults: UserDefaults { var gameStyleChanged = 0 overrid
我创建了 appGroups 并使用该组设置了 NSUserDefaults。我有一个观察者,当值更改时不会触发该观察者。 let defaults = NSUserDefaults(suiteNam
在我的项目中,我使用应用程序组将数据传输到 Apple Watch!这看起来像这样 let sharedDefaults = NSUserDefaults(suiteName: "group.com.
有点被这个难住了。我正在开发一个需要通过 NSUserDefaults 与其容器应用程序通信的 Xcode 扩展。为此,您需要在扩展程序和容器应用程序中设置一个应用程序组授权,签署您的应用程序,然后像
我在使用 NSUserDefaults(suiteName: "group.app-ID") 时遇到问题。 我尝试将 NSArray 保存到 viewDidLoad() 中容器应用程序的 NSUser
我是一名优秀的程序员,十分优秀!