Cambie objetos en NSUserDefaults sin crear y volver a configurar copias

votos
6

Tengo el diccionario almacenado NSUserDefaultsy necesito agregar / eliminar elementos en este diccionario.

Me molesta que para hacer esto tengo que crear una copia mutable de todo el diccionario, cambiar un elemento y reemplazar todo el diccionario con una nueva copia.

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

e implica aún más copia y reajuste para objetos más profundos en la jerarquía.

¿Hay una mejor manera?

He intentado usarlo, [defaults setValue:… forKeyPath:@foo.bar]pero parece que no funciona (el objeto no es mutable).

Publicado el 14/08/2009 a las 14:07
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
5

Normalmente creo una clase personalizada para mantener todas las preferencias de mi aplicación. Esa clase puede cargar copias mutables de userDefaults una vez, cuando se inicia el programa, y ​​luego manejar todas las copias incrementales en el camino:

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

Creo una instancia de esta clase en mi delegado de aplicación y luego llamo [myPrefs load]cuando se inicia mi aplicación. Cualquier preferencia modificada mientras el programa se está ejecutando puede modificarse myPrefsy luego guardarse llamando al [myPrefs save]modo deseado:

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

Como una ventaja adicional, puede estructurar la MyPreferencesclase de la manera que desee, llevando los beneficios de la programación OO a todo el conjunto de preferencias. Mostré el camino fácil aquí, simplemente usando un diccionario mutable, pero puede convertir cada preferencia en una propiedad, y hacer procesamiento previo / posterior para objetos más complicados como NSColor, por ejemplo.

Respondida el 14/08/2009 a las 15:08
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more