web-dev-qa-db-fra.com

Cocoa - Notification sur le changement de valeur NSUserDefaults?

Disons que j'ai une clé @ "MyPreference", avec une valeur correspondante stockée dans NSUserDefaults.

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

Ou pourrait-il être fait à travers des liaisons? (Mais dans ce cas, au lieu de lier la valeur à un élément d'interface utilisateur, je souhaite que mon objet soit informé de la modification 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 permettant d'obtenir la paire clé-valeur spécifique qui a été modifiée. (N'hésitez pas à corriger.)

51
SirRatty

J'ai passé toute la journée à chercher la réponse, seulement 10 minutes après avoir posé la question ...

Entré dans une solution par Key-Value-Observing:

[[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];
79
SirRatty

Rapide:

override func viewDidLoad() {
  super.viewDidLoad()
  NSUserDefaults.standardUserDefaults().addObserver(self, forKeyPath: "THE KEY", options: NSKeyValueObservingOptions.New, context: nil)
}

override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
  // your logic
}

deinit {
  NSUserDefaults.standardUserDefaults().removeObserver(self, forKeyPath: "THE KEY")
}
16
Brian

Et les employés Apple ont conseillé d'utiliser la notification NSUserDefaultsDidChangeNotification ici: https://devforums.Apple.com/message/237718#237718

9
DenNukem

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é NSUserdefault afin de sauvegarder d'autres objets. Si vous utilisez Key Value Observer, tenez compte du problème de Zombie sur NSUserDefaults.

Voici le lien vers la solution: NSUserDefaults and KVO issues

0
Tarika Chawla