2010-06-08 6 views
16

Se ho una persona classe personalizzata che ha tre variabili (che sono propertized e sintetizzati):Il modo migliore per salvare in nsuserdefaults per la classe personalizzata?

NSString* theName; 
float* theHeight; 
int theAge; 

istanze persona sono memorizzati in un NSArray 'Gruppo'. C'è solo un gruppo. Qual è il modo migliore per archiviare e caricare il gruppo in NSUserDefaults? (Tenendo presente che galleggiano e int non sono legali per NSUserDefaults) La risposta di

+2

Perché aren' t float e int legale? 'NSUserDefaults' ha metodi per entrambi. –

+0

Hai risolto il tuo problema? Si prega di contrassegnare la risposta corretta per contrassegnare questo post come risposta. –

risposta

45

@Brad Smith non è completa, e anche non è corretto in un certo senso. Dobbiamo usare NSKeyedArchiver e NSKeyedUnarchiver come segue:

Fai la classe (per esempio in questo caso Person) per conformarsi al protocollo NSCoding e implementare entrambi i metodi come:

- (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>]; 
} 

Utilizzando 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

Vorrei poter alzare la tua risposta verso l'alto. Brad Smith è totalmente fuorviante. –

+2

Così vote down @BredSmith come ho fatto io – Dejell

+0

@Kailash, quindi qual è l'uso dei metodi di codifica e decodifica? Quale codificatore dovrei passare quando lo istanziamo? O viene chiamato automaticamente quando si salva e si legge? – gdubs

1

trovo attuazione encodeWithCoder e initWithCoder abbastanza noioso, soprattutto se si hanno molti attributi nella classe, e molte classi per risparmiare a NSUserDefaults.

Creo una libreria RMMapper (https://github.com/roomorama/RMMapper) per aiutare a salvare l'oggetto personalizzato in NSUserDefaults in modo più semplice e conveniente.

Per contrassegnare una classe come archiviabile, basta usare: #import "NSObject+RMArchivable.h"

Per salvare un oggetto personalizzato in NSUserDefaults:

#import "NSUserDefaults+RMSaveCustomObject.h" 

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

Per ottenere personalizzato OBJ da NSUserDefaults:

user = [defaults rm_customObjectForKey:@"SAVED_DATA"]; 
Problemi correlati