My main view controller is added as observer for some key in UserDefault. But every time the value changed, observeValue is called twice.
The stacks are different for these two calls.
The first one is from
frame #6: forEachObserver + 332
frame #7: -[CFPrefsSource didChangeValues:forKeys:count:] + 68
frame #8: -[CFPrefsSource setValues:forKeys:count:removeValuesForKeys:count:] + 340
frame #9: -[CFPrefsSource setValue:forKey:] + 56
The second one is from
frame #6: forEachObserver + 332
frame #7: -[CFPrefsSource _notifyObserversOfChangeFromValuesForKeys:toValuesForKeys:] + 68
frame #8: __84-[CFPrefsSearchListSource asynchronouslyNotifyOfChangesFromDictionary:toDictionary:]_block_invoke_2 + 36
The only related post I found is from cocoa-dev mail list https://lists.apple.com/archives/cocoa-dev/2016/Nov/msg00084.html. It seems this issue appears from MacOS 10.12
Can someone provide more details on why it happens or how to suppress the duplicate messages?
A minimal example to reproduce:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
UserDefaults.standard.addObserver(
self,
forKeyPath: "test",
options: .new,
context: nil
)
UserDefaults.standard.set(true, forKey: "test")
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
print("Observed: \(object ?? "None")")
}
}