2010-08-11 15 views
9

¿Existe un límite de tamaño para guardar diccionarios?NSDictionary writeToFile

Estoy intentando escribir un diccionario bastante grande con alrededor de 100 claves con diccionarios anidados utilizando writeToFile: pero nunca se escribe y siempre es falso.

¿Es esta una limitación o estoy haciendo algo incorrecto,

El código que uso es la siguiente.

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

[myDict writeToFile: fullPath atomically:YES]; 
+0

¿Estás seguro de que no tienes objetos no codificables incrustados en el árbol de diccionarios? Hay un conjunto limitado de objetos que se ajustan a NSCoding. Comprueba en la consola que tengo la sensación de que oculta el detalle del objeto ofensivo si ese es el caso. –

Respuesta

12

No hay límite de tamaño (excepto para la memoria y el espacio en disco).

¿Cuáles son los contenidos de myDict?

Si es cualquier cosa menos el pequeño conjunto de clases permitido en las listas de propiedades, entonces no puede usar writeToFile:atomically:.

O bien necesitaría limitar su diccionario a solo contener instancias de esas clases o, necesitará usar un método de archivo diferente.

En particular, muchas de las bibliotecas JSON arrojarán NSNULL instancias en las colecciones. Esos no pueden ser archivados. Debe editarlos o reemplazarlos con objetos que pueden archivar.

De relevancia:

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/PropertyLists/Introduction/Introduction.html

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/Archiving/Archiving.html#//apple_ref/doc/uid/10000047i

+5

tuve el mismo problema y el problema era el objeto [NSNull null] en el diccionario :) – yasirmturk

+0

@yasirmturk - ¡Eso fue todo! Gracias. – Myxtic

27

Hay un truco más de esto, además de utilizar sólo los objetos elegibles (instancias de NSNumber, NSString, NSData etc) las llaves tienen que ser NSString objetos. Normalmente puede usar cualquier objeto para la clave NSDictionary pero tener un writeToFile exitoso: las claves en NSDictionary necesitan ser instancias NSString.

+7

Estaba teniendo problemas para guardar un NSDictionary usando writeToFile, esta respuesta me ayudó a resolver el problema que estaba teniendo. Los inconvenientes como este pueden ser una tonta pérdida de tiempo para solucionar problemas. – ozz

+0

¡Quería confirmar que esto de hecho resolvió mi problema! Estaba usando NSNumber (s) como clave, pero el diccionario no va a escribir, ¡después de convertir los números en cadenas funcionó! Gracias, @Otuken! – Motasim

4

Me gustaría añadir un truco más que me encontré con Lion. La carpeta a la que desea escribir el plist debe existir antes de llamar a NSDictionary's writeToFile:atomically:. Puede usar NSFileManager para probar la existencia y crear una nueva carpeta si es necesario.

0

Tuve esto, como es mencionado por otros el diccionario no se puede guardar con algunos tipos de datos (NULLs notables).

Como mi diccionario era de un servidor (en forma de JSON) no podía garantizar lo que contenía, así que guardé los datos SIN PROCESAR (desde dataWithContentsOfURL) antes de la serialización de JSON. Para este fin, supongo que podrías convertir el dict a NSData y guardarlo, algo así como;

NSData *convetedData = [NSKeyedArchiver archivedDataWithRootObject:JSONDict]; 

Y luego recuperar y convertir de esta manera.

NSDictionary *JSONDict = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithData:convertedDATA];