2010-06-08 13 views
16

Si tengo una persona de clase personalizada que tiene tres variables (que se sintetizan y propertized):¿La mejor manera de guardar en nsuserdefaults para la clase personalizada?

NSString* theName; 
float* theHeight; 
int theAge; 

casos persona se almacenan en 'Grupo' un NSArray. Solo hay un grupo ¿Cuál es la mejor forma de almacenar y cargar el grupo en NSUserDefaults? (teniendo en cuenta que float e int no son legales para NSUserDefaults)

+2

Por qué aren' t float e int legal? 'NSUserDefaults' tiene métodos para ambos. –

+0

¿Has resuelto tu problema? Marque la respuesta correcta para marcar esta publicación como respondida. –

Respuesta

45

@Brad La respuesta de Smith no es completa, e incluso es incorrecta en algún sentido. Tenemos que usar NSKeyedArchiver y NSKeyedUnarchiver de la siguiente manera:

Haga su clase (por ejemplo, en este caso Person) para cumplir con el protocolo NSCoding y poner en práctica tanto los métodos como:

- (id)initWithCoder:(NSCoder *)decoder { 
    self = [super init]; 
    if(self) { 
     self.name = [decoder decodeObjectForKey:<key_for_property_name>]; 
     // as height is a pointer 
     *self.height = [decoder decodeFloatForKey:<key_for_property_height>]; 
     self.age = [decoder decodeIntForKey:<key_for_property_age>]; 
    } 
    return self; 
} 

- (void)encodeWithCoder:(NSCoder *)encoder { 
    [encoder encodeObject:self.name forKey:<key_for_property_name>]; 
    //as height is a pointer 
    [encoder encodeFloat:*self.height forKey:<key_for_property_height>] 
    [encoder encodeInt:self.age forKey:<key_for_property_age>]; 
} 

Usando NSUserDefaults

// Write to NSUserDefaults 
NSData *archivedObject = [NSKeyedArchiver archivedDataWithRootObject:<your_class_object>]; 
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults setObject:archivedObject forKey:<key_for_archived_object>]; 
[defaults synchronize]; 

// Read from NSUserDefaults 
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSData *archivedObject = [defaults objectForKey:<key_for_archived_object>]; 
<your_class> *obj = (<your_class> *)[NSKeyedUnarchiver unarchiveObjectWithData:archivedObject]; 
+3

Ojalá pueda votar su respuesta a la cima. Brad Smith es totalmente engañoso. –

+2

Así que vote abajo @BredSmith como lo hice – Dejell

+0

@Kailash, entonces ¿para qué sirven los métodos de codificación y descodificación? ¿Qué codificador debería pasar al instanciarlo? ¿O se llama automáticamente al guardar y leer? – gdubs

1

Creo que la implementación de encodeWithCoder y initWithCoder es bastante aburrida, especialmente si tiene muchos atributos en su clase y muchas clases para guardar en NSUserDefaults.

Creo una biblioteca RMMapper (https://github.com/roomorama/RMMapper) para ayudar a guardar el objeto personalizado en NSUserDefaults más fácil y más conveniente.

Para marcar una clase como Archivable, sólo tiene que utilizar: #import "NSObject+RMArchivable.h"

Para guardar un objeto personalizado en NSUserDefaults:

#import "NSUserDefaults+RMSaveCustomObject.h" 

NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; 
[defaults rm_setCustomObject:user forKey:@"SAVED_DATA"]; 

para obtener OBJ personalizado desde NSUserDefaults:

user = [defaults rm_customObjectForKey:@"SAVED_DATA"]; 
Cuestiones relacionadas