2009-10-29 12 views
6

प्रारंभ में मैंने सोचा कि यह काम करने जा रहा है, लेकिन अब मैं समझता हूं कि ऐसा नहीं होगा क्योंकि कलाकार चयन "कलाकार" वस्तुओं का एक एनएसएमयूटेबलएरे है।डिस्क पर ऑब्जेक्ट्स के एनएसएमयूटेबलएरे को सहेजें/लिखें?

@interface Artist : NSObject { 
    NSString *firName; 
    NSString *surName; 
} 

मेरा प्रश्न डिस्क पर रिकॉर्डिंग का सबसे अच्छा तरीका "कलाकार" वस्तुओं की मेरी NSMutableArray ताकि मैं उन्हें अगली बार मैं अपने एप्लिकेशन को चलाने के लोड कर सकते हैं क्या है?

artistCollection = [[NSMutableArray alloc] init]; 

newArtist = [[Artist alloc] init]; 
[newArtist setFirName:objFirName]; 
[newArtist setSurName:objSurName]; 
[artistCollection addObject:newArtist]; 

NSLog(@"(*) - Save All"); 
[artistCollection writeToFile:@"/Users/Fgx/Desktop/stuff.txt" atomically:YES]; 

संपादित

बहुत धन्यवाद, सिर्फ एक अंतिम बात मैं के बारे में उत्सुक हूँ। यदि "कलाकार" में आगे की वस्तुओं (अनुप्रयोग) के एनएसएमयूटेबलएरे (सॉफ़्टवेयरऑनड) का एक अतिरिक्त आवृत्ति चर शामिल है, तो मैं इसे कवर करने के लिए एन्कोडिंग का विस्तार कैसे करूं? क्या मैं "अनुप्रयोग" ऑब्जेक्ट में एनएससीओडी जोड़ूंगा, फिर "कलाकार" को एन्कोड करने से पहले एन्कोड करूँगा या "कलाकार" में इसे निर्दिष्ट करने का कोई तरीका है?

@interface Artist : NSObject { 
    NSString *firName; 
    NSString *surName; 
    NSMutableArray *softwareOwned; 
} 

@interface Application : NSObject { 
    NSString *appName; 
    NSString *appVersion; 
} 

बहुत धन्यवाद

गैरी

+0

अपने संपादित उत्तर देने के लिए:

@interface Artist : NSObject <NSCoding> { NSString *firName; NSString *surName; } @end @implementation Artist static NSString *FirstNameArchiveKey = @"firstName"; static NSString *LastNameArchiveKey = @"lastName"; - (id)initWithCoder:(NSCoder *)decoder { self = [super init]; if (self != nil) { firName = [[decoder decodeObjectForKey:FirstNameArchiveKey] retain]; surName = [[decoder decodeObjectForKey:LastNameArchiveKey] retain]; } return self; } - (void)encodeWithCoder:(NSCoder *)encoder { [encoder encodeObject:firName forKey:FirstNameArchiveKey]; [encoder encodeObject:surName forKey:LastNameArchiveKey]; } @end 
इस के साथ

, आप संग्रह सांकेतिक शब्दों में बदलना कर सकते हैं बस अपने आवेदन वर्ग के लिए NSCoding लागू और, कलाकार के एन्कोड में विथकोडर: और initWithCoder :, म्यूटेबल सरणी के एन्कोडिंग/डिकोडिंग को संभालने के लिए लाइनें जोड़ें। जब खुद को एन्कोड करने के लिए कहा जाता है, तब सरणी अनुप्रयोग वस्तुओं को स्वयं को एन्कोड करने के लिए कहती है। –

+0

आह मैं देखता हूं, सही, धन्यवाद ओले। – fuzzygoat

उत्तर

18

में writeToFile:atomically: के लिए एक व्यायाम के रूप में छोड़ दिया जाता है कोको के संग्रह कक्षाएं केवल संपत्ति सूचियों के लिए काम करती हैं, यानी केवल उन संग्रहों के लिए जिनमें एनएसएसटींग, एनएसएनंबर, अन्य संग्रह इत्यादि जैसे मानक ऑब्जेक्ट्स शामिल हैं

jdelStrother's answer पर विस्तृत करने के लिए, आप NSKeyedArchiver का उपयोग कर संग्रह संग्रहित कर सकते हैं यदि संग्रह में मौजूद सभी ऑब्जेक्ट्स स्वयं संग्रहित कर सकते हैं। अपने कस्टम वर्ग के लिए इसे लागू करने के लिए, यह NSCoding प्रोटोकॉल के अनुरूप:

NSData* artistData = [NSKeyedArchiver archivedDataWithRootObject:artistCollection]; 
[artistData writeToFile: @"/Users/Fgx/Desktop/stuff" atomically:YES]; 
9

NSKeyedArchiver पर एक नजर डालें। संक्षेप में:

NSData* artistData = [NSKeyedArchiver archivedDataWithRootObject:artistCollection]; 
[artistData writeToFile: @"/Users/Fgx/Desktop/stuff" atomically:YES]; 

आप encodeWithCoder लागू करने के लिए की आवश्यकता होगी: अपने कलाकार वर्ग पर - देख Apple's docs

गैर अभिलेख (NSKeyedUnarchiver देखें) पाठक :)

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