2010-09-29 19 views
6

Estoy intentando guardar una matriz de imágenes en la carpeta de documentos. Logré guardar una imagen como NSData y recuperarla usando el método a continuación, pero guardar una matriz parece estar más allá de mí. He visto muchas otras preguntas que se relacionan y parece que estoy haciendo todo bien.Escribir una matriz de NSData en el archivo

Adición de la imagen como NSData y guardar la imagen:

[imgsData addObject:UIImageJPEGRepresentation(img, 1.0)]; 
[imgsData writeToFile:dataFilePath atomically:YES]; 

Recuperación de los datos:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"imgs.dat"]; 
[self setDataFilePath:path]; 

NSFileManager *fileManager = [NSFileManager defaultManager]; 
if([fileManager fileExistsAtPath:dataFilePath]) 
imgsData = [[NSMutableArray alloc] initWithContentsOfFile:dataFilePath]; 

Así, escribiendo una imagen como NSData usando lo anterior funciona, pero no una serie de imágenes como NSData. Entra en la matriz, pero tiene 0 objetos, lo que no es correcto, ya que la matriz que estoy guardando tiene varios. ¿Alguien tiene alguna idea?

Respuesta

8

En primer lugar, debe repasar Cocoa Memory Management, la primera línea de código es un poco preocupante.

Para la serialización de datos, es posible que desee tener un ir con NSPropertyListSerialization. Esta clase serializa matrices, diccionarios, cadenas, fechas, números y objetos de datos. Tiene un sistema de informe de errores, a diferencia de los métodos initWithContentsOfFile:. Los nombres y argumentos del método son un poco largos para caber en una línea, por lo que a veces puede verlos escritos con la notación Eastern Polish Christmas Tree. Para guardar el objeto imgsData, puede utilizar:

NSString *errString; 
NSData *serialized = 
    [NSPropertyListSerialization dataFromPropertyList:imgsData 
               format:NSPropertyListBinaryFormat_v1_0 
            errorDescription:&errString]; 

[serialized writeToFile:dataFilePath atomically:YES]; 

if (errString) 
{ 
    NSLog(@"%@" errString); 
    [errString release]; // exception to the rules 
} 

para leerlo de nuevo, utilizar

NSString *errString; 
NSData *serialized = [NSData dataWithContentsOfFile:dataFilePath]; 

// we provide NULL for format because we really don't care what format it is. 
// or, if you do, provide the address of an NSPropertyListFormat type. 

imgsData = 
    [NSPropertyListSerialization propertyListFromData:serialized 
            mutabilityOption:NSPropertyListMutableContainers 
               format:NULL 
            errorDescription:&errString]; 

if (errString) 
{ 
    NSLog(@"%@" errString); 
    [errString release]; // exception to the rules 
} 

comprobar el contenido de errString para determinar lo que salió mal. Tenga en cuenta que estos dos métodos están en desuso en favor de los métodos dataWithPropertyList:format:options:error: y propertyListWithData:options:format:error:, pero estos se agregaron en Mac OS X 10.6 (no estoy seguro de si están disponibles en iOS).

+0

Buen punto con respecto a la gestión de memoria. +1 – Moshe

+0

¡Guau, perfecto! Gracias, funciona de maravilla! – Beaker

+0

Además, en una nota al margen, dataWithPropertyList: format: options: error: está disponible en iOS 4. Así que no es útil para mí, pero puede ayudar con cualquier programador de iPhone 4. – Beaker

Cuestiones relacionadas