2010-06-08 5 views
16

अगर मैं एक कस्टम वर्ग व्यक्ति जो तीन चर (जो propertized और संश्लेषित कर रहे हैं) है है:कस्टम वर्ग के लिए nsuserdefaults में सहेजने का सबसे अच्छा तरीका?

NSString* theName; 
float* theHeight; 
int theAge; 

व्यक्ति उदाहरणों एक NSArray 'समूह' में संग्रहीत हैं। केवल एक समूह है। NSUserDefaults में समूह को संग्रहीत करने और लोड करने का सबसे अच्छा तरीका क्या है? (यह ध्यान में रखते हुए कि फ्लोट और int NSUserDefaults के लिए कानूनी नहीं हैं)

+2

क्यों 'नहीं कर रहे टी फ्लोट और int कानूनी? 'NSUserDefaults' में दोनों के लिए विधियां हैं। –

+0

क्या आपने अपनी समस्या का समाधान किया? उत्तर के रूप में इस पोस्ट को चिह्नित करने के लिए सही उत्तर चिह्नित करें। –

उत्तर

45

@ ब्रैड स्मिथ का उत्तर पूरा नहीं हुआ है, और यहां तक ​​कि कुछ अर्थों में भी गलत है।

(इस मामले Person में उदाहरण के लिए) अपनी कक्षा बनाओ प्रोटोकॉल NSCoding के अनुरूप और दोनों तरीकों को लागू करने के रूप में:

- (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]; 
का उपयोग हम NSKeyedArchiver उपयोग करने के लिए इस प्रकार है और NSKeyedUnarchiver
+3

मेरी इच्छा है कि मैं आपके उत्तर को शीर्ष पर उठा सकूं। ब्रैड स्मिथ पूरी तरह से भ्रामक है। –

+2

तो @BredSmith को वोट दें क्योंकि मैंने – Dejell

+0

@ कैलाश किया था, तो एनकोड और डिकोड विधियों का उपयोग क्या है? इसे तुरंत चालू करते समय मुझे क्या एन्कोडर पास करना चाहिए? या वह सहेजने और पढ़ने के दौरान स्वचालित रूप से बुलाया जाता है? – gdubs

1

मुझे एन्कोडविथकोडर और initWithCoder को बहुत उबाऊ कार्यान्वित करने लगता है, खासकर यदि आपके पास कक्षा में कई विशेषताएं हैं, और कई कक्षाएं NSUserDefaults को सहेजने के लिए हैं।

मैं एक पुस्तकालय RMMapper (https://github.com/roomorama/RMMapper) बनाता हूं ताकि NSUserDefaults में कस्टम ऑब्जेक्ट को आसान और अधिक सुविधाजनक में सहेजने में मदद मिल सके।

archivable के रूप में एक वर्ग चिह्नित करने के लिए, बस का उपयोग करें: #import "NSObject+RMArchivable.h"

NSUserDefaults में एक कस्टम वस्तु सहेजने के लिए:

#import "NSUserDefaults+RMSaveCustomObject.h" 

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

कस्टम NSUserDefaults से obj करने के लिए:

user = [defaults rm_customObjectForKey:@"SAVED_DATA"]; 
संबंधित मुद्दे