2009-11-02 10 views
14

में कनवर्ट करना मुझे NSObject को NSData में परिवर्तित करने में कोई समस्या है। मेरे पास एक कक्षा है जो NSObject विरासत में है।NSDbject को NSData

इस प्रकार जब मैं NSData में उस विशेष वर्ग की वस्तु में परिवर्तित करने की कोशिश की:

NSData *dataOnObject = [NSKeyedArchiver archivedDataWithRootObject:classObject]; 

लेकिन यह बताते हुए कि -[classObject encodeWithCoder:]: गैर मान्यता प्राप्त चयनकर्ता उदाहरण के लिए भेजा अपवाद देता है ..

मैं भी जोड़ लिया है के रूप में

NSMutableArray *wrapperedData = [NSMutableArray arrayWithObject: classObject]; 
NSData *dataOnObject = [NSKeyedArchiver archivedDataWithRootObject:value]; 

लेकिन फिर भी एक नव निर्मित सरणी वस्तु, इसके अपवाद बाहर दे रही है।

तो मुझे ऑब्जेक्ट classObject से बाइट निकालने की आवश्यकता है।

किसी भी मदद की बहुत सराहना की जाएगी ...

आपके उत्तर के लिए इंतजार कर रहा

...

उत्तर

5

आप कर सकते हैं केवल संग्रह वस्तुओं का समर्थन करने वाले NSCoding प्रोटोकॉल

7

आप encodeWithCoder लागू करने की आवश्यकता: पर अपने कस्टम क्लास, एनएससीओडर का उपयोग करके अपने सभी गुणों को क्रमबद्ध करना। यदि इसके गुणों में कोई और कस्टम क्लास शामिल है, तो उन्हें एन्कोडविथकोडर की आवश्यकता होगी: भी कार्यान्वित करना।

6

NSData *dataOnObject = [NSKeyedArchiver archivedDataWithRootObject:classObject]; 

के बजाय

यह

NSData *dataOnObject = [[NSUserDefaults standardUserDefaults] objectForKey:@"someKey"]; 

होना चाहिए लेकिन में है कि पहले से ही बचाया गया है कि डेटा पढ़ने के लिए बस है। यदि आप किसी ऑब्जेक्ट को NSData के रूप में सहेजना चाहते हैं तो आपके पास यह है:

[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:classObject] forKey:@"someKey"]; 

लेकिन यह सब कुछ नहीं है। आपके क्लास ऑब्जेक्ट को एनएससीओडिंग प्रोटोकॉल को कार्यान्वित करना है और दो विधियों को एन्कोड करना हैथोडर: और initWithCoder: चूंकि यह काम करने के लिए एनएस ऑब्जेक्ट नहीं है।

+0

यह क्यों कम हो गया? जबरदस्त हंसी। –

+1

(मैंने आपको डाउनवोट नहीं किया था) शायद ऐसा इसलिए है क्योंकि NSKeyedUnarchiver NSUserDefaults को मैप नहीं करता है ... – CodaFi

+3

यह अवधारणा NSUserDefaults –

1

आप किसी भी ऑब्जेक्ट को एनएसडीडीएड प्रोटोकॉल के साथ एनएसडीटा में परिवर्तित कर सकते हैं।

आप इस यहाँ करने के लिए नमूना कोड पा सकते हैं:
http://samsoff.es/posts/archiving-objective-c-objects-with-nscoding

21

आप इस तरह के रूप में अपने स्वयं के वस्तु के लिए लागू करना चाहिए:

- (void)encodeWithCoder:(NSCoder *)aCoder 
{ 
    [aCoder encodeObject:self.name forKey:@"name"]; 
    [aCoder encodeInt:self.age forKey:@"age"]; 
    [aCoder encodeObject:self.email forKey:@"email"]; 
    [aCoder encodeObject:self.password forKey:@"password"]; 
} 
BOOL success = [NSKeyedArchiver archiveRootObject:person toFile:archiveFilePath]; 

और:

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    if (self = [super init]) { 
     self.name = [aDecoder decodeObjectForKey:@"name"]; 
     self.age = [aDecoder decodeIntForKey:@"age"]; 
     self.email = [aDecoder decodeObjectForKey:@"email"]; 
     self.password = [aDecoder decodeObjectForKey:@"password"]; 
    } 
    return self; 
} 
Person *unarchivePerson = [NSKeyedUnarchiver unarchiveObjectWithFile:archiveFilePath]; 
0

यह एक है एनएसडीटा में परिवर्तित कस्टम ऑब्जेक्ट का उदाहरण (इसलिए इसे उपयोगकर्ता डिफ़ॉल्ट में सहेजा जा सकता है)

निम्न फ़ाइलें बनाएं:

कैटलॉग।ज

@interface Catalog : NSObject 

@property (nonatomic, assign) int pk; 
@property (nonatomic, copy) NSString *catalogName; 
@property (nonatomic, copy) NSString *catalogDescription; 
@property (nonatomic, assign) int catalogEdition; 
@property (nonatomic, assign) int catalogTotalPages; 

- (void)encodeWithCoder:(NSCoder *)aCoder; 
- (id)initWithCoder:(NSCoder *)aDecoder; 

@end 

Catalog.m

#import <Foundation/Foundation.h> 
#import "Catalog.h" 

@implementation Catalog 

- (void)encodeWithCoder:(NSCoder *)aCoder { 
    [aCoder encodeObject:self.catalogName forKey:@"catalogName"]; 
    [aCoder encodeObject:self.catalogDescription forKey:@"catalogDescription"]; 
    [aCoder encodeInt:self.catalogEdition forKey:@"catalogEdition"]; 
    [aCoder encodeInt:self.catalogTotalPages forKey:@"catalogTotalPages"]; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    if (self = [super init]) { 
     self.catalogName = [aDecoder decodeObjectForKey:@"catalogName"]; 
     self.catalogDescription = [aDecoder decodeObjectForKey:@"catalogDescription"]; 
     self.catalogEdition = [aDecoder decodeIntForKey:@"catalogEdition"]; 
     self.catalogTotalPages = [aDecoder decodeIntForKey:@"catalogTotalPages"]; 
    } 
    return self; 
} 

@end 

अंत में अपने नियंत्रक में शीर्ष लेख शामिल फ़ाइलें

#import "Catalog.h" 

और (उपयोगकर्ता चूक में बचत इस मामले im में) अपने वस्तु का उपयोग करने के लिए इस कोड को जोड़ने

  Catalog *catalog = [[Catalog alloc] init]; 
      catalog.catalogName = @"catalogName"; 
      catalog.catalogDescription = @"catalogName"; 
      catalog.catalogEdition = 1; 

नोट: कोड की इस पंक्ति में है, जहां वास्तविक डेटा गुजर जगह

//archiving object to nsdata 
NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:catalog]; 

[[NSUserDefaults standardUserDefaults] setObject:encodedObject forKey:@"keyName"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 

ले जा रहा है मामले में आप वापस NSData

से
NSData *nsData = [[NSUserDefaults standardUserDefaults] objectForKey:@"keyName"]; 
//unarchiving object to nsdata 
Catalog *selectedCatalog = [NSKeyedUnarchiver unarchiveObjectWithData: nsData]; 

आशा इस मदद करता है अपने वस्तु प्राप्त करना चाहते हैं!

संबंधित मुद्दे