Question

J'ai stocké dans le dictionnaire NSUserDefaults et je dois ajouter / supprimer des éléments dans ce dictionnaire.

Il me gêne que pour ce faire, je dois créer une copie mutable du dictionnaire entier, changer un élément et le remplacer dictionnaire entier avec une nouvelle copie.

copy = [[defaults objectForKey:@"foo"] mutableCopy];
[copy setObject:… forKey:@"bar"];
[defaults setObject:copy forKey:@"foo"];

et il implique encore plus la copie et re-réglage pour des objets plus profondément dans la hiérarchie.

Y at-il une meilleure façon?

J'ai essayé d'utiliser [defaults setValue:… forKeyPath:@"foo.bar"] mais cela ne semble pas fonctionner (objet non modifiable).

Était-ce utile?

La solution

Je crée généralement une classe personnalisée pour tenir toutes mes préférences de l'application. Cette classe peut charger des copies mutables des userDefaults une fois, lorsque le programme démarre, puis gérer tous les arrêts supplémentaires le long du chemin:

MyPreferences.h

@interface MyPreferences
{
   NSMutableDictionary allPrefs;
}
@property (readonly) NSMutableDictionary * allPrefs;
- (void)load;
- (void)save;
@end

MyPreferences.m

@implementation MyPreferences
@synthesize allPrefs;

- (id)init
{
    if ((self = [super init]) == nil) { return nil; }
    allPrefs = [[NSMutableDictionary alloc] initWithCapacity:0];
    return self;
}

- (void)dealloc
{
    [allPrefs release];
    [super dealloc];
}

- (void)load
{
    // load all mutable copies here
    [allPrefs setObject:[[defaults objectForKey:@"foo"] mutableCopy]
                 forKey:@"foo"];
    // ...
}

- (void)save
{
    [defaults setObject:allPrefs forKey:@"app_preferences"];
}

@end

Je crée une instance de cette classe dans mon délégué de l'application, puis appelez [myPrefs load] lorsque mes lancements d'application. Toutes les préférences ont changé alors que le programme est en cours d'exécution peut être modifié par myPrefs, puis enregistré en appelant [myPrefs save] comme vous le souhaitez:

MyPreferences * myPrefs = [myApplication myPrefs];
[myPrefs setObject:bar forKeyPath:@"allPrefs.foo.bar"];
[myPrefs save];

En prime, vous pouvez structurer la classe MyPreferences comme vous le souhaitez, apporter les avantages de la programmation orientée objet à l'ensemble des préférences. J'ai montré la voie facile ici, en utilisant simplement un dictionnaire mutable, mais vous pouvez faire chaque préférence dans une propriété, et faire du traitement de pré / post pour des objets plus complexes comme NSColor, par exemple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top