cocoa – Notification de modification de la valeur NSUserDefaults?

Disons que j’ai une clé @ “MyPreference”, avec une valeur correspondante stockée via NSUserDefaults.

Y a-t-il un moyen d’être notifié lorsque la valeur est modifiée?

Ou pourrait-il être fait par des reliures? (Mais dans ce cas, au lieu de lier la valeur à un élément de l’interface utilisateur, je souhaite que mon object soit averti du changement, afin que je puisse effectuer d’autres tâches.)

Je suis conscient que NSUserDefaultsDidChangeNotification peut être observé, mais cela semble être une approche tout ou rien, et il ne semble pas y avoir de mécanisme pour obtenir la paire clé-valeur spécifique qui a été modifiée. (N’hésitez pas à corriger.)

Passé toute la journée à chercher la réponse, seulement pour le trouver 10 minutes après avoir posé la question …

Entré dans une solution grâce à l’observation par valeur-clé:

[[NSUserDefaultsController sharedUserDefaultsController] addObserver:self forKeyPath:@"values.MyPreference" options:NSKeyValueObservingOptionNew context:NULL]; 

Ou plus simplement (par commentaire ci-dessous):

 [[NSUserDefaults standardUserDefaults] addObserver:self forKeyPath:@"MyPreference" options:NSKeyValueObservingOptionNew context:NULL]; 

Rapide:

 override func viewDidLoad() { super.viewDidLoad() NSUserDefaults.standardUserDefaults().addObserver(self, forKeyPath: "THE KEY", options: NSKeyValueObservingOptions.New, context: nil) } override func observeValueForKeyPath(keyPath: Ssortingng, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer) { // your logic } deinit { NSUserDefaults.standardUserDefaults().removeObserver(self, forKeyPath: "THE KEY") } 

Et l’employé d’Apple conseillé d’utiliser la notification NSUserDefaultsDidChangeNotification ici: https://devforums.apple.com/message/237718#237718

Je suis d’accord avec @ DenNukem. J’utilisais le NSKeyValueObservingOptionNew. Mais cette fonction a commencé à me donner l’erreur BADACCESS Code = 1 partout où j’ai utilisé le NSUserdefault afin de sauvegarder d’autres objects. Si vous utilisez Key Value Observer, prenez juste connaissance du problème de Zombie sur NSUserDefaults.

Voici le lien vers la solution: problèmes NSUserDefaults et KVO