2010-06-08 7 views
16

Jeśli mam zwyczaj klasy osoba, która ma trzy zmienne (które są syntetyzowane propertized a):Najlepszy sposób na zapisanie do nsuserdefaults dla niestandardowej klasy?

NSString* theName; 
float* theHeight; 
int theAge; 

przypadki osoby są przechowywane w „Grupa” an NSArray. Jest tylko jedna grupa. Jaki jest najlepszy sposób przechowywania i ładowania grupy w NSUserDefaults? (mając na uwadze, że float i int nie są legalne dla NSUserDefaults)

+2

Dlaczego aren” t float i int legal? 'NSUserDefaults' ma metody dla obu. –

+0

Czy rozwiązałeś swój problem? Proszę zaznaczyć poprawną odpowiedź, aby oznaczyć ten post jako odpowiedzi. –

Odpowiedz

45

@Brad Smith nie jest kompletna, a nawet w pewnym sensie jest niepoprawna. Musimy wykorzystać NSKeyedArchiver i NSKeyedUnarchiver następująco:

Dokonaj klasy (na przykład w tym przypadku Person) w celu dostosowania się do protokołu NSCoding i wdrożyć zarówno metody jak:

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

Korzystanie 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

Życzę sobie, abym mógł odpowiedzieć na twoją odpowiedź na szczyt. Brad Smith jest całkowicie zwodniczy. –

+2

Więc głosuj w dół @BredSmith jak ja – Dejell

+0

@ Kailash, więc jaki jest pożytek z metod kodowania i dekodowania? Jaki koder powinienem przekazać podczas tworzenia instancji? Czy jest to automatycznie wywoływane podczas zapisywania i czytania? – gdubs

1

Uważam, że wdrażanie encodeWithCoder i initWithCoder jest dość nudne, szczególnie jeśli masz wiele atrybutów w swojej klasie i wiele klas do zapisania w NSUserDefaults.

Tworzę bibliotekę RMMapper (https://github.com/roomorama/RMMapper), aby łatwiej i wygodniej zapisywać niestandardowy obiekt w NSUserDefault.

Aby oznaczyć klasę jako archiwizacji, wystarczy użyć: #import "NSObject+RMArchivable.h"

Aby zapisać niestandardowego obiektu do NSUserDefaults:

#import "NSUserDefaults+RMSaveCustomObject.h" 

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

Aby zwyczaj obj od NSUserDefaults:

user = [defaults rm_customObjectForKey:@"SAVED_DATA"]; 
Powiązane problemy