2009-10-29 17 views
6

Inicialmente pensé que esto iba a funcionar, pero ahora entiendo que no lo hará porque artistCollection es una NSMutableArray de objetos "Artist".Guardar/Escribir NSMutableArray de los objetos en el disco?

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

Mi pregunta es ¿cuál es la mejor manera de grabar en el disco mi NSMutableArray de objetos "artista" de modo que pueda cargar ellos la próxima vez que corro mi solicitud?

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

EDITAR

Muchas gracias, solo una última cosa tengo curiosidad. Si "Artist" contenía una variable de instancia adicional de NSMutableArray (softwareOwned) de otros objetos (Aplicaciones) ¿cómo expandiría la codificación para cubrir esto? ¿Añadiría NSCoding al objeto "Aplicaciones", luego codificaría eso antes de codificar "Artist" o hay alguna forma de especificar esto en "Artist"?

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

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

muchas gracias

gary

+0

para responder a sus editar: acaba de poner en práctica NSCoding para su clase de aplicaciones y, en Artist's encodeWithCoder: e initWithCoder :, agregue líneas para manejar la codificación/descodificación de la matriz mutable. Cuando se le pide que se codifique, la matriz le pedirá a los objetos Aplicación que se codifiquen. –

+0

Ah, ya veo, perfecto, gracias Ole. – fuzzygoat

Respuesta

18

writeToFile:atomically: en Cocoa de clases de colección sólo funciona para las listas de propiedades, es decir, sólo para colecciones que contienen objetos estándar como NSString, NSNumber, otras colecciones, etc.

dar más detalles sobre jdelStrother's answer, se puede archivar colecciones usando NSKeyedArchiver si todos los objetos que contiene la colección pueden archivarse. Para implementar esto para su clase personalizada, que sea conforme con la NSCoding protocolo:

@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 

Con esto, se puede codificar la colección:

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

Echa un vistazo a NSKeyedArchiver. En pocas palabras:

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

Tendrá que aplicar encodeWithCoder: en su clase de artista - ver Apple's docs

desarchivar (ver NSKeyedUnarchiver) se deja como ejercicio para el lector :)

Cuestiones relacionadas