2010-06-08 7 views
16

Wenn ich eine benutzerdefinierte Klasse Person haben, die drei Variablen hat (die propertized und synthetisiert):Beste Methode zum Speichern in nsuserdefaults für benutzerdefinierte Klasse?

NSString* theName; 
float* theHeight; 
int theAge; 

Person Instanzen in einer NSArray ‚Gruppe‘ gespeichert sind. Es gibt nur eine Gruppe. Was ist der beste Weg zum Speichern und Laden der Gruppe in NSUserDefaults? (Bedenkt, dass float und int für NSUserDefaults nicht zulässig sind)

+2

Warum ‚aren t float und int legal? 'NSUserDefaults' hat Methoden für beide. –

+0

Haben Sie Ihr Problem gelöst? Bitte markieren Sie die richtige Antwort, um diesen Beitrag als beantwortet zu markieren. –

Antwort

45

@Brad Smiths Antwort ist nicht vollständig und in gewissem Sinne sogar falsch. Wir haben NSKeyedArchiver verwenden und NSKeyedUnarchiver wie folgt:

Klasse Stellen (zum Beispiel in diesem Fall Person) zu Protokoll entsprechen NSCoding und implementieren sowohl die Methoden als:

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

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]; 
Verwendung
+3

Ich wünschte, ich könnte deine Antwort an die Spitze bringen. Brad Smith ist völlig irreführend. –

+2

Also stimme @BredSmith ab wie ich es gemacht habe – Dejell

+0

@Kailash, also was ist die Verwendung der Enkodierungs- und Dekodiermethoden? Welchen Encoder sollte ich weitergeben, wenn ich ihn instanziiere? Oder wird das beim Speichern und Lesen automatisch aufgerufen? – gdubs

1

Ich finde die Implementierung von encodeWithCoder und initWithCoder ziemlich langweilig, vor allem, wenn Sie viele Attribute in Ihrer Klasse haben und viele Klassen in NSUserDefaults speichern.

Ich erstelle eine Bibliothek RMMapper (https://github.com/roomorama/RMMapper), um benutzerdefiniertes Objekt in NSUserDefaults einfacher und bequemer zu speichern.

Um eine Klasse als archivierbar zu markieren, verwenden Sie einfach: #import "NSObject+RMArchivable.h"

Um ein benutzerdefiniertes Objekt in NSUserDefaults zu sparen:

#import "NSUserDefaults+RMSaveCustomObject.h" 

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

Um benutzerdefinierte von NSUserDefaults obj zu erhalten:

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