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 时才会触发。