2012-11-10 28 views
5

मैं एक कुकबुक एप्लिकेशन लिख रहा हूं, और मैं अपनी कक्षा (डेटा पकाने की विधि) के डेटा को सहेजने के तरीके पर कुछ भी नहीं ढूंढ पा रहा हूं।मैं ऑब्जेक्टिव-सी ऑब्जेक्ट को कैसे सहेज सकता हूं जो एक संपत्ति सूची ऑब्जेक्ट नहीं है या संपत्ति सूची से इसके लिए कोई बेहतर तरीका है?

-(void) writeToFile:(NSString *)file atomically:(BOOL)atomic{ 

} 

लेकिन मेरे पास है: एक ही तरीका है मैंने देखा है संभवतः अलग-अलग मेरी पकाने की विधि वर्ग के लिए इस विधि बनाकर प्रत्येक वस्तु के लिए वर्ग के प्रत्येक तत्व को सहेजे बिना एक पूरे के रूप में इस वर्ग की सामग्री को बचाने के लिए होगा इस विधि का उपयोग कर इस ऑब्जेक्ट को फ़ाइल में सहेजने के लिए मैं इसे कार्यान्वित करने के बारे में बिल्कुल नहीं जानता हूं। कुछ गुण हैं:

NSString* name; 
UIImage* recipePicture; 
NSDate* dateAdded; 
NSMutableArray* ingredients; //The contents are all NSStrings. 

क्या कोई जानता है कि पकाने की विधि के किसी वस्तु को बचाने के बारे में कैसे जाना है? यह मुझे पागल कर रहा है कि इसे समझने में सक्षम न हो। किसी भी तरह की सहायता का स्वागत किया जाएगा। मेरे पास पहले से ही "RecipeData.plist" नामक एक .plist है। क्या मुझे सिर्फ हर संपत्ति को प्लिस्ट में लिखने की आवश्यकता होगी और रनटाइम पर उन गुणों के साथ नुस्खा की एक नई वस्तु शुरू करनी होगी?

उत्तर

5

अपनाएं:

@interface Recipe : NSObject<NSCoding> 

लागू:

- (void)encodeWithCoder:(NSCoder *)coder 
{ 
    [coder encodeObject:name_ forKey:@"name"]; 
    [coder encodeObject:recipePicture_ forKey:@"recipePicture"]; 
    [coder encodeObject:dateAdded_ forKey:@"dateAdded"]; 
    [coder encodeObject:ingredients_ forKey:@"ingredients"]; 

}

// Decode an object from an archive 
- (id)initWithCoder:(NSCoder *)coder 
{ 
    self = [super init]; 
    if (self!=NULL) 
    { 
     name_ = [coder decodeObjectForKey:@"name"]; 
     recipePicture_ = [coder decodeObjectForKey:@"recipePicture"]; 
     dateAdded_ = [coder decodeObjectForKey:@"dateAdded"]; 
     ingredients_ = [coder decodeObjectForKey:@"ingredients"]; 
    } 
    return self; 
} 

में अब आप अपने को बचाने:

- (void) save:(NSString*)path recipe:(Recipe*)recipe 
{ 
    NSMutableData* data=[[NSMutableData alloc] init]; 
    if (data) 
    { 
     NSKeyedArchiver* archiver=[[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 
     if (archiver) 
     { 
      [archiver encodeInt:1 forKey:@"Version"]; 
      [archiver encodeObject:recipe forKey:@"Recipe"]; 
      [archiver finishEncoding]; 

      [data writeToFile:path atomically:YES]; 

     } 
    } 
} 

और भार में:

- (Recipe*) load:(NSString*)path 
{ 
    Recipe* ret=NULL; 
    NSData* data=[NSData dataWithContentsOfFile:path]; 
    if (data) 
    { 
     NSKeyedUnarchiver* unarchiver=[[NSKeyedUnarchiver alloc] initForReadingWithData:data]; 
     if (unarchiver) 
     { 
      int version=[unarchiver decodeIntForKey:@"Version"]; 
      if (version==1) 
      { 
       ret=(Recipe*)[unarchiver decodeObjectForKey:@"Recipe"]; 
      } 
      [unarchiver finishDecoding]; 
     } 
    } 
    return ret; 
} 
+0

आपको इसे उत्तर के दो-तिहाई के साथ अपडेट करना चाहिए - किसी संपत्ति सूची में संग्रहण के लिए एनएसडीटा ऑब्जेक्ट को एन्कोड करना और संपत्ति सूची से डेटा को कैसे डीकोड करना है। – rmaddy

+0

जैसा कि मैंने नीचे टिप्पणी में कहा था, मुझे यह दिखाने के लिए समय देने के लिए बहुत बहुत धन्यवाद कि यह कैसे करें। यह वास्तव में एक बड़ी मदद की गई है। – crarho

+0

आपको 'self = [super initWithCoder: coder]' को कॉल करना चाहिए; 'self = [super init];' के बजाय। अन्यथा, आपके सुपरक्लास में एन्कोडेड डेटा नहीं होगा। –

2

एक विकल्प (अलावा एन्कोडिंग/डिकोडिंग) एक शब्दकोश में अपने वर्ग की प्रत्येक विशेषता स्टोर करने के लिए है। फिर आप फ़ाइल में शब्दकोश लिखते हैं। यह चाल यह सुनिश्चित करने के लिए है कि आपके द्वारा शब्दकोश में डाली गई प्रत्येक वस्तु को एक प्लेस्ट में अनुमति दी जाए। आपके द्वारा दिखाए गए चार गुणों में से, यूआईएममेज के रूप में सभी को संग्रहीत किया जा सकता है।

-(BOOL)writeToFile:(NSString *)file atomically:(BOOL)atomic{ 
    NSMutableDictionary *data = [NSMutableDictionary dictionary]; 

    [data setObject:name forKey:@"name"]; 
    [data setObject:dateAdded [email protected]"dataAdded"]; 

    NSDate *imageData = UIImagePNGRepresentation(recipePicture); 
    [data setObject:imageData forKey:@"recipePicture"]; 

    // add the rest 

    return [data writeToFile:file atomically:YES]; 
} 

मैंने इसे एक बूल वापस करने के लिए अपडेट किया। यदि यह विफल रहता है, तो इसका अर्थ है दो चीजों में से एक:

  1. फ़ाइल था अनुचित
  2. आप Dictonary

आप से बचने के लिए कोड जोड़ने की जरूरत में एक गैर plist अनुकूल वस्तु को बचाने की कोशिश यदि आपके पास nil ऑब्जेक्ट्स जोड़ने की कोशिश कर रहा है। महत्वपूर्ण बात यह सुनिश्चित करना है कि सभी चाबियां तार हैं और केवल प्लिस्ट-फ्रेंडली ऑब्जेक्ट्स संग्रहीत हैं (एनएसएसटींग, एनएसएनंबर, एनएसडीएटी, एनएसवेल्यू, एनएसडीटा, एनएसएआरएआरई, और एनएस डिक्शनरी)।

+0

सभी मदद के लिए बहुत बहुत धन्यवाद। इसकी बहुत सराहना की गई है- यह समस्या मुझे थोड़ी देर के लिए परेशान कर रही है। – crarho