2010-06-09 11 views
19

Estoy intentando guardar una matriz, que tiene algunos diccionarios dentro, en un archivo plist pero falla. No obtengo ningún error Hago exactamente las mismas líneas de arriba en el código solo con otra matriz y eso funciona ... No puedo entender por qué no guarda el archivo.NSArray writeToFile falla

Aquí es donde puedo guardar el archivo: (ver algunos salida de un depurador a continuación)

// When built parse through dictionary and save to file 
    for (NSString *keys in [dicByCountry allKeys]) 
    { 
     NSArray *arrr = [[NSArray alloc] initWithArray:[dicByCountry objectForKey:keys]]; 
     NSString *fname = [self filePath:[NSString stringWithFormat:@"regions.cid%@.plist",keys]]; 
     if (![arrr writeToFile:fname atomically:YES]) 
      NSLog(@"Could not write file regions.cid%@.plist",keys); 
    } 

Aquí alguna salida GDB

(gdb) po fname 
/Users/chris/Library/Application Support/iPhone Simulator/4.0/Applications/44A9FF9E-5715-4BF0-9BE2-525883281420/Documents/regions.cid0.plist 


(gdb) po arrr 
<__NSArrayI 0x8022b30>(
{ 
    countryID = "<null>"; 
    region = "?\U00e2vora"; 
    regionID = 16; 
}, 
{ 
    countryID = "<null>"; 
    region = Vicenza; 
    regionID = 14; 
}, 
{ 
    countryID = "<null>"; 
    region = Wales; 
    regionID = 23; 
} 
) 

Respuesta

33

Si lee the documentation de cerca, writeToFile:atomically: espera que la matriz contiene solamente objetos que pueden escribirse en un archivo plist.

Sólo los objetos de tipo:

  • NSString
  • NSData
  • NSDate
  • NSNumber
  • NSArray
  • NSDictionary

están permitidos. Si tiene arrays o diccionarios dentro de la matriz que está guardando, sus valores serán examinados por los mismos criterios.

Esto es algo más restrictivo de lo que normalmente se permite en NSArray s. En particular, el valor [NSNull null] no es aceptable.

+0

Gracias ese era el problema. – Chris

+1

¿Qué hay de NSNumber? ¿Qué hay de nil? –

+0

Las matrices no pueden contener 'nil' y la documentación no indica que' NSNumber's son válidas como valores de la lista de propiedades. – warrenm

27

Convierto NSArray o NSDictionary a NSData antes de la serialización. A continuación se encuentra una categoría sobre nsarray para serializar y deserializar. Este comfortableby maneja algunos datos siendo nsnull

@implementation NSArray(Plist) 

-(BOOL)writeToPlistFile:(NSString*)filename{ 
    NSData * data = [NSKeyedArchiver archivedDataWithRootObject:self]; 
    NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString * documentsDirectory = [paths objectAtIndex:0]; 
    NSString * path = [documentsDirectory stringByAppendingPathComponent:filename]; 
    BOOL didWriteSuccessfull = [data writeToFile:path atomically:YES]; 
    return didWriteSuccessfull; 
} 

+(NSArray*)readFromPlistFile:(NSString*)filename{ 
    NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString * documentsDirectory = [paths objectAtIndex:0]; 
    NSString * path = [documentsDirectory stringByAppendingPathComponent:filename]; 
    NSData * data = [NSData dataWithContentsOfFile:path]; 
    return [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
} 

@end //needs to be set for implementation 
+0

Usé este código en NSDictionary, y funcionó muy bien. ¡Gracias! – Nathan

+0

¡El código funciona como un jefe! – DAS

+0

Eso funciona asombrosamente, y es realmente fácil de modificar para 'NSDictionary' también ... – Nick