UserDefaults.didChangeNotification не срабатывает - PullRequest
0 голосов
/ 04 июля 2018

Проект, над которым я работаю, имеет расширение, которое записывает данные в UserDefaults. Затем в содержащем приложении пользовательский интерфейс должен обновляться в соответствии с изменениями. Проблема в том, что 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()

}

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

До сих пор не знаю, почему другой способ не работает, но работает следующее, так что это решение. В соответствии с предложенным здесь я сделал следующее:

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

Он запускается немедленно и только при изменении значения UserDefaults для ключа Common.ReceivedNotifications.

0 голосов
/ 04 июля 2018

Код #selector(userDefaultsDidChange) означает func userDefaultsDidChange() без параметра.

Но вы определили func userDefaultsDidChange(_ notification: Notification), у него есть один параметр.

Следующий шаг:

Изменение #selector(userDefaultsDidChange) на #selector(userDefaultsDidChange(_:)) может исправить это.

...