UserDefaults.didChangeNotification 没有开火
UserDefaults.didChangeNotification not firing
我正在处理的项目有一个将数据写入 UserDefaults 的扩展。然后在包含应用程序中 UI 应该根据更改进行更新。问题是 UserDefaults.didChangeNotification
不会被触发,除非屏幕来自后台。可能是什么原因,有没有办法修复或通过其他方式获得所需的更新?
在扩展中写入数据:
let sharedUserDefaults = UserDefaults(suiteName: Common.UserDefaultsSuite)
var receivedNotifications = sharedUserDefaults?.array(forKey: Common.ReceivedNotifications)
if receivedNotifications != nil {
receivedNotifications?.append(aData)
} else {
receivedNotifications = [aData]
}
sharedUserDefaults?.set(receivedNotifications, forKey: Common.ReceivedNotifications)
在视图控制器中注册通知:
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(userDefaultsDidChange), name: UserDefaults.didChangeNotification, object: nil)
}
并使用更改后的用户默认设置(实际上不会调用):
@objc func userDefaultsDidChange(_ notification: Notification) {
print("User defaults did change")
gatherReceivedNotifications()
}
代码#selector(userDefaultsDidChange)
表示func userDefaultsDidChange()
不带参数。
但是你定义了func userDefaultsDidChange(_ notification: Notification)
,它只有一个参数。
下一步:
把#selector(userDefaultsDidChange)
改成#selector(userDefaultsDidChange(_:))
就可以解决了。
仍然不知道为什么另一种方法不起作用,但下面的方法有效,所以它是一个解决方案。按照建议 here 我做了以下事情:
override func viewDidLoad() {
super.viewDidLoad()
UserDefaults(suiteName: Common.UserDefaultsSuite)?.addObserver(self, forKeyPath: Common.ReceivedNotifications, options: .new, context: nil)
}
然后实施observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?)
:
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == Common.ReceivedNotifications {
gatherReceivedNotifications()
}
}
它会立即触发,并且仅当更改键 Common.ReceivedNotifications
的 UserDefaults 时才会触发。
我正在处理的项目有一个将数据写入 UserDefaults 的扩展。然后在包含应用程序中 UI 应该根据更改进行更新。问题是 UserDefaults.didChangeNotification
不会被触发,除非屏幕来自后台。可能是什么原因,有没有办法修复或通过其他方式获得所需的更新?
在扩展中写入数据:
let sharedUserDefaults = UserDefaults(suiteName: Common.UserDefaultsSuite)
var receivedNotifications = sharedUserDefaults?.array(forKey: Common.ReceivedNotifications)
if receivedNotifications != nil {
receivedNotifications?.append(aData)
} else {
receivedNotifications = [aData]
}
sharedUserDefaults?.set(receivedNotifications, forKey: Common.ReceivedNotifications)
在视图控制器中注册通知:
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(userDefaultsDidChange), name: UserDefaults.didChangeNotification, object: nil)
}
并使用更改后的用户默认设置(实际上不会调用):
@objc func userDefaultsDidChange(_ notification: Notification) {
print("User defaults did change")
gatherReceivedNotifications()
}
代码#selector(userDefaultsDidChange)
表示func userDefaultsDidChange()
不带参数。
但是你定义了func userDefaultsDidChange(_ notification: Notification)
,它只有一个参数。
下一步:
把#selector(userDefaultsDidChange)
改成#selector(userDefaultsDidChange(_:))
就可以解决了。
仍然不知道为什么另一种方法不起作用,但下面的方法有效,所以它是一个解决方案。按照建议 here 我做了以下事情:
override func viewDidLoad() {
super.viewDidLoad()
UserDefaults(suiteName: Common.UserDefaultsSuite)?.addObserver(self, forKeyPath: Common.ReceivedNotifications, options: .new, context: nil)
}
然后实施observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?)
:
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == Common.ReceivedNotifications {
gatherReceivedNotifications()
}
}
它会立即触发,并且仅当更改键 Common.ReceivedNotifications
的 UserDefaults 时才会触发。