2009-05-04 12 views
7

Ich habe eine NSMutableArray, die Objekte des Typs Person (NSString, NSString, int) Ich bin auf der Suche nach einer einfachen Möglichkeit, dieses Array auf CD zu speichern und später wieder zu laden.Speichern NSMutableArray auf Platte

Ich habe viel über Serialisierung gelesen, aber ich habe das nie getan. Vielleicht ist es doch nicht der einfachste Weg für mich.

Antwort

10

Der erste Schritt besteht darin, dass Ihre Person-Klasse das NSCoding-Protokoll implementiert. Die grundlegende Strategie besteht darin, zwei Methoden zum Serialisieren und Deinserialisieren jeder Instanzvariablen des Objekts zu implementieren, die Sie zwischen den Sitzungen beibehalten möchten.

#pragma mark NSCoding Protocol 

- (void)encodeWithCoder:(NSCoder *)encoder; 
{ 
    [encoder encodeObject:[self foo] forKey:@"foo"]; 
    [encoder encodeDouble:[self bar] forKey:@"bar"]; 
} 

- (id)initWithCoder:(NSCoder *)decoder; 
{ 
    if (![super init]) 
     return nil; 

    [self setFoo:[decoder decodeObjectForKey:@"foo"]]; 
    [self setBar:[decoder decodeDoubleForKey:@"bar"]]; 

    return self; 
} 

Um tatsächlich die Objekte auf die Festplatte zu schreiben, könnten Sie NSArray der writeToFile: Methode, oder verwenden Sie die NSKeyedUnarchiver Klasse verwenden, wenn Sie genauer festlegen zu wollen, wie es gemacht wird. In beiden Fällen können Sie Ihr Array auch in eine andere Datenstruktur (z. B. ein Wörterbuch) einfügen, wenn Sie andere Elemente (z. B. eine Dateiformatnummer) in Ihre Datendatei einfügen möchten.

+0

Entfernen Sie diese; s –

+1

eigentlich ich denke, das ist nicht notwendig, es sieht einfach komisch aus hah –

4

Herr Charbonneau hat die richtige Idee. Ein NSCoder abstrahiert die spezifische Serialisierung Ihres Objekts und lässt Sie nur darüber sorgen, was serialisiert/deserialisiert werden muss. In -encodeWithCoder:, möchten Sie vielleicht

NSAssert1([encoder allowsKeyedCoding], 
      @"%@ does not support sequential archiving.", 
      [self className]); 

, da nicht alle Programmierer Schlüsselarchivierung unterstützen.

In -initWithCoder, sollten Sie -initWithCoder: Senden - nicht einfach -init - zu super vor Ihrem Objekt zu initialisieren:

self = [super initWithCoder:decoder]; 
if (!self) return nil; 
// now use the coder to initialize your state 

Alternativ kann, da das Objekt bereits im Grunde eine Eigenschaftsliste ist, Sie so etwas wie -[Person plistRepresentation] hinzufügen :

- (NSDictionary *)plistRepresentation 
{ 
    return [NSDictionary dictionaryWithObjectsAndKeys: 
      [self firstName], @"firstName", 
      [self lastName], @"lastName", 
      [NSNumber numberWithInteger:[self age]], @"age", nil]; 
} 

Dann eine Reihe von Person s serialisiert werden, können Sie sich die Personen verwandeln kann in ihre plistRepresentation und dann -[NSArray writeToURL:atomically:] verwenden. (Sie können natürlich auch die Methoden der NSProperyListSerialization direkt beschäftigen.)

1

Es funktioniert gewohnt hier in meinem Code von writeToFile mit: atomar:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *issueURLsPlist = [documentsDirectory stringByAppendingPathComponent:@"test.plist"]; 

MyClass * myObject = [[MyClass alloc] init]; 
NSMutableArray * array = [[NSMutableArray alloc] init]; 
[array addObject:myObject]; 
[array writeToFile:issueURLsPlist atomically:YES]; 

MyClass.h

#import <Foundation/Foundation.h> 


@interface MyClass : NSObject <NSCoding> 
{ 

} 

@property (nonatomic,copy) NSString * foo; 
@property (nonatomic)  double bar; 


@end 

MyClass. m

Wenn ich ein Array mit NSStrings verwende, dann die Methode writeToFile: atomic Verbündeter: funktioniert gut.

Verwandte Themen