2011-09-22 8 views
6

Sto ricevendo un NSDictionary da JSON (usando SBJson), e voglio memorizzarlo. Sto usandowriteToFile non riesce - come faccio a eseguire il debug PERCHÉ fallisce (quali strumenti)?

[liveData writeToFile:localFilePath atomically:YES] 

e non funziona. I dati sembrano come tutti i suoi NSString, NSDictionary e NSArray (che richiede "atomicamente: SÌ"). Ho usato lo stesso localFilePath da qualche parte.

Quindi la mia domanda è: come posso scoprire dove si trova il problema? Quali strumenti posso usare per capire perché writeToFile fallisce? Il registro non mostra un messaggio di errore.

+0

Avete NSLoggato su 'localFilePath' per vedere qual è il valore? Sei sicuro di aver dato un nome univoco per salvare come? – msgambel

+0

Sono d'accordo sul probabile problema del tuo percorso, puoi includere quel codice? – Brodie

+1

Ho registrato il mio localFilePath e l'ho usato anche altrove nel mio codice per memorizzare qualcos'altro (cambiando solo il nome del file - è NSTemporaryDirectory() più il nome del file) quindi sono abbastanza sicuro che non lo è. Ma in realtà la mia domanda è: come faccio a eseguire il debug di questo problema: come posso scoprire di più sull'errore? C'è un codice di errore o qualche strumento di debug in xcode al di fuori del logger che mi aiuterebbe a collegarlo? O devo solo usare prove ed errori per individuarlo? –

risposta

7

Può avere diverse ragioni:

  • Il percorso che si sta scrivendo è sbagliato, non è scrivibile (non si ha accesso in scrittura ad esso), o la directory padre non esiste (se localFilePath è "/path/to/file.plist" ma la directory "/ path/to /" non esiste, fallirà)
  • Il dizionario liveData contiene oggetti che non sono oggetti PropertyList. Solo NSData, NSDate, NSNumber, NSString, NSArray, o NSDictionary oggetti possono essere scritti in un file di Property List (e writeToFile:atomically:fare scrittura a un file plist in modo che il dizionario fare devono contiene solo gli oggetti plist per quel metodo per avere successo)
+1

Inoltre, se si ha un valore 'NULL' nel dizionario' writeToFile' fallirà. – inorganik

+0

Nessun valore della classe NSNull nel dizionario avrà esito negativo. Quindi, controlla esplicitamente tutti i valori prima di inserirlo nel dizionario. Nel mio caso, stavo leggendo i valori da JSON (dati del server) che è una buona fonte di tali valori. – zinnuree

1

ho provato con un risparmio NSDictionary a disco con solo numeri per le chiavi e valori. La commutazione delle chiavi su NSString funziona ma non quando le chiavi sono NSNumber. Le chiavi devono essere NSString?

EDIT: So meglio ora che può essere qualsiasi oggetto che risponde all'hash; spesso è NSString, però.

+1

Sì, lo fanno. Vedi la mia risposta sopra. – badweasel

+0

Sigh ... ha dovuto convertire da NSNumber a NSString per salvare i dati nel file. Grazie per il consiglio. –

4

So che questa è una domanda di 2 anni. Ma dal momento che ho appena avuto lo stesso problema e risolto questo è quello che ho trovato. Scommetto che il tuo NSDictionary ha alcune chiavi che non sono NSStrings.

Piuttosto che digitare come:

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

chiave come:

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

quello fissato il mio problema fino.

Il modo superiore non può essere salvato in un file Plist.

Poiché si ottengono le informazioni da una conversione JSON, è possibile che ci siano alcuni oggetti o chiavi NSNumbers. Dovresti convertirli. Ma questo è un dolore.

Quindi, dato che lo avete già in json, salvatelo come stringa json nella sua interezza in un tasto @ "data" e lo ri-espandete quando caricate il plist più tardi nell'array o dict.

+0

Questo ha risolto il mio problema (nel mio caso, avevo le chiavi che erano 'NSDate's), tuttavia, non risponde ancora alla domanda di quali strumenti sono disponibili per il debug. Sarebbe bello se ci fosse qualcosa che potrei colpire al codice con quello che direbbe qualcosa come "* NSDate non è una chiave valida per scrivere su un file plist *" o qualcosa del genere. – Olie

Problemi correlati