2009-10-29 11 views
6

Anfangs dachte ich, das würde funktionieren, aber jetzt verstehe ich es nicht, weil artistCollection ein NSMutableArray von "Artist" -Objekten ist.Speichern/Schreiben NSMutableArray von Objekten auf der Festplatte?

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

Meine Frage ist, was ist die beste Art und Weise auf die Festplatte der Aufnahme meine NSMutableArray von „Artist“ Objekte, so dass ich sie das nächste Mal lade ich meine Anwendung ausführen?

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

EDIT

Vielen Dank, nur eine letzte Sache, die ich bin gespannt. Wenn "Artist" eine zusätzliche Instanzvariable von NSMutableArray (softwareOwned) für weitere Objekte (Applications) enthält, wie würde ich die Codierung erweitern, um dies zu berücksichtigen? Würde ich NSCoding zum "Applications" -Objekt hinzufügen und dieses vor der Kodierung von "Artist" kodieren oder gibt es eine Möglichkeit, dies in "Artist" anzugeben?

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

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

vielen Dank

gary

+0

Um Ihre Antwort bearbeiten: einfach implementieren NSCoding für Ihre Anwendungsklasse und fügen Sie in Artists encodeWithCoder: und initWithCoder: Zeilen hinzu, um die Kodierung/Dekodierung des veränderbaren Arrays zu handhaben. Wenn das Array aufgefordert wird, sich selbst zu codieren, fordert das Array die Anwendungsobjekte auf, sich selbst zu codieren. –

+0

Ah ich sehe, perfekt, danke Ole. – fuzzygoat

Antwort

18

writeToFile:atomically: in Cocoa Sammlungsklassen funktionieren nur für Eigenschaftslisten, dh nur für Sammlungen, die Standardobjekte wie NSString, NSNumber, andere Sammlungen usw. enthalten.

Um näher zu jdelStrother's answer, Sie kann Sammlungen unter Verwendung von NSKeyedArchiver archivieren, wenn alle Objekte, die die Sammlung enthält, sich selbst archivieren können. Um dies zu implementieren für Ihre benutzerdefinierte Klasse, um es in die NSCoding Protokoll konform machen:

@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 

Mit diesem können Sie die Sammlung kodieren:

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

Werfen Sie einen Blick auf NSKeyedArchiver. Kurz:

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

Sie werden encodeWithCoder implementieren müssen: auf der Künstler-Klasse - Apple's docs

Aufheben der Archivierung (siehe NSKeyedUnarchiver) sehen ist, für den Leser als Übung :)

Verwandte Themen