2011-09-22 35 views
6

Obtendré un NSDictionary de JSON (usando SBJson) y deseo almacenarlo. Estoy usandowriteToFile falla - ¿cómo puedo depurar POR QUÉ falla (qué herramientas)?

[liveData writeToFile:localFilePath atomically:YES] 

y falla. Los datos se ven como como todos sus NSString, NSDictionary y NSArray (que "atómico: SÍ" exige). Utilicé el mismo localFilePath en otro lugar.

Así que mi pregunta es: ¿cómo puedo averiguar dónde está el problema? ¿Qué herramientas puedo usar para entender por qué writeToFile falla? El registro no muestra un mensaje de error.

+0

¿Ha NSLogged su 'localFilePath' para ver cuál es el valor? ¿Estás seguro de haberle dado un nombre único para guardar como? – msgambel

+0

Acepto que el problema es su camino, ¿puede incluir ese código? – Brodie

+1

He registrado mi localFilePath, y también lo he usado en otro lugar de mi código para almacenar algo más (cambiando solo el nombre del archivo, es NSTemporaryDirectory() plus filename) así que estoy bastante seguro de que no es así. Pero realmente mi pregunta es: ¿cómo puedo depurar este problema? ¿Cómo puedo obtener más información sobre la falla? ¿Hay algún código de error o alguna herramienta de depuración en xcode fuera del registrador que me ayude a precisarlo? ¿O solo necesito usar prueba y error para identificarlo? –

Respuesta

7

Puede tener varias razones:

  • El camino que está escribiendo está mal, no se puede escribir (que no tiene acceso de escritura a la misma), o no existe el directorio padre (si es localFilePath "/path/to/file.plist" pero el directorio "/ ruta/a /" no existe, fallará)
  • El diccionario liveData contiene objetos que no son objetos PropertyList. Sólo NSData, NSDate, NSNumber, NSString, NSArray, o NSDictionary objetos se puede escribir en un archivo de lista de propiedades (y writeToFile:atomically:hacer escribir en un archivo plist por lo que el diccionario hacer tienen que contiene sólo los objetos PLIST para que el método tenga éxito)
+1

También vale la pena señalar, si tiene un valor 'NULL' en su diccionario' writeToFile' fallará. – inorganik

+0

Cualquier valor de clase NSNull en el diccionario fallará. Por lo tanto, verifique explícitamente todos los valores antes de ponerlos en el diccionario. En mi caso, estaba leyendo valores de JSON (datos del servidor), que es una buena fuente de dichos valores. – zinnuree

1

He intentado guardar un NSDictionary en el disco con solo números para claves y valores. Cambiar las claves a NSString funciona pero no cuando las claves son NSNumber. ¿Las llaves tienen que ser NSString?

EDIT: Sé mejor ahora que puede ser cualquier objeto que responda al hash; a menudo es NSString, sin embargo.

+1

Sí lo hacen. Ver mi respuesta arriba. – badweasel

+0

Suspiro ... tuvo que convertir de NSNumber a NSString para guardar los datos en un archivo. Gracias por el consejo. –

4

Sé que esta es una pregunta de hace 2 años. Pero como acabo de tener el mismo problema y lo solucioné, esto es lo que encontré. Apuesto a que su NSDictionary tiene algunas claves que no son NSStrings.

En lugar de introducir como:

[_myDictionay setObject:thisObj forKey:[NSNumber numberWithInt:keyNumber]]; 

clave como:

[_myDictionay setObject:thisObj forKey:[NSString stringWithFormat:@"%i",numberWithInt:keyNumber]]; 

que fijó mi problema derecho hacia arriba.

La ruta principal no se puede guardar en un archivo plist.

Como obtiene su información de una conversión JSON, es posible que haya algunos objetos o claves que sean NSNumbers allí. Deberías convertirlos. Pero eso es un dolor.

Así que como ya lo tiene en json, simplemente almacénelo como la cadena json en su totalidad en una @ tecla de "datos" y vuelva a expandirlo cuando cargue el plist posteriormente en su matriz o dict.

+0

Esto solucionó mi problema (en mi caso, tenía claves que eran 'NSDate's), sin embargo, todavía no responde la pregunta de qué herramientas están disponibles para depurar. Sería genial si hubiera algo que pudiera introducir en el código que diga algo como "* NSDate no es una clave válida para escribir en un archivo plist *" o algo así. – Olie

Cuestiones relacionadas