2009-10-29 20 views
6

Początkowo myślałem, że to zadziała, ale teraz rozumiem, że tak nie będzie, ponieważ artistCollection to obiekt NSMutableArray obiektów "Artist".Zapisz/Zapisz NSMutableArray obiektów na dysk?

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

Moje pytanie brzmi, co jest najlepszym sposobem zapisu na dysku mojego NSMutableArray obiektów „Artysta”, aby można było załadować je następnym razem uruchomić mój wniosek?

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

Dziękujemy, tylko jedna ostateczna rzeczą jestem ciekaw. Jeśli "Artist" zawierał dodatkową zmienną instancji NSMutableArray (softwareOwned) kolejnych obiektów (Applications), w jaki sposób rozszerzyć kodowanie, aby to uwzględnić? Czy dodać NSCoding do obiektu "Applications", a następnie zakodować to przed kodowaniem "Artist" lub czy istnieje sposób na określenie tego w "Artist"?

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

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

wiele dzięki

Gary

+0

Aby odpowiedzieć na to EDIT: po prostu wdrożyć NSCoding dla swojej klasie aplikacji oraz w encodeWithCoder Artist: i initWithCoder :, dodaj linie do obsługi kodowania/dekodowania tablicy zmiennych. Gdy zostanie poproszony o zakodowanie, tablica zapyta obiekty aplikacji o kodowanie. –

+0

Ah Widzę, idealnie, dzięki Ole. – fuzzygoat

Odpowiedz

18

writeToFile:atomically: w Cocoa klasy kolekcji działają tylko w przypadku list właściwości, tzn. tylko w przypadku zbiorów zawierających standardowe obiekty, takie jak NSString, NSNumber, inne kolekcje itp.

Aby opracować na jdelStrother's answer, należy można archiwizować zbiory przy użyciu NSKeyedArchiver, jeśli wszystkie obiekty znajdujące się w kolekcji mogą się archiwizować. W celu realizacji tego dla swojej klasy niestandardowego, sprawiają, że są zgodne z protokołem NSCoding:

@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 

z tym, można zakodować kolekcji:

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

Spójrz na NSKeyedArchiver. W skrócie:

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

Musisz wdrożyć encodeWithCoder: o klasie artysty - patrz Apple's docs

Cofam archiwizację (patrz NSKeyedUnarchiver) pozostawiamy jako ćwiczenie dla czytelnika :)

Powiązane problemy