2010-08-11 16 views
9

Esiste un limite di dimensione per il salvataggio dei dizionari?NSDictionary writeToFile

Sto tentando di scrivere un dizionario piuttosto grande con circa 100 chiavi con dizionari nidificati utilizzando writeToFile: ma non scrive mai ed è sempre falso.

Si tratta di una limitazione o sto facendo qualcosa di sbagliato,

Il codice che uso è il seguente.

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

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

Sei sicuro di non abbia alcuna oggetti non codificabile incorporati nella struttura di dizionario. Theres un set limitato di oggetti conformi a NSCoding. Avere un controllo nella console Ho la sensazione che ritrovi il dettaglio dell'oggetto offensivo lì dentro, se questo è il caso. –

risposta

12

Non esiste un limite di dimensioni (risparmio per memoria e spazio su disco).

Quali sono i contenuti di myDict?

Se non è disponibile un gruppo limitato di classi negli elenchi di proprietà, non è possibile utilizzare writeToFile:atomically:.

O è necessario limitare il dizionario solo alle istanze di tali classi o, sarà necessario utilizzare un metodo di archiviazione diverso.

In particolare, molte librerie JSON rilasceranno istanze NSNULL nelle raccolte. Quelli non possono essere archiviati È necessario modificarli o sostituirli con oggetti che possono essere archiviati.

Di rilevanza:

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

ho avuto lo stesso problema e il problema era l'oggetto [NSNull null] nel dizionario :) – yasirmturk

+0

@yasirmturk - L'ha fatto! Grazie. – Myxtic

27

C'è un altro trucco per questo, oltre ad utilizzare solo gli oggetti ammissibili (istanze di NSNumber, NSString, NSData ecc) le chiavi devono essere NSString oggetti. Normalmente puoi usare qualsiasi oggetto per la chiave NSDictionary ma avere un writeToFile di successo: le chiavi nel NSDictionary devono essere istanze NSString.

+7

Avevo difficoltà a salvare un NSDictionary usando writeToFile, questa risposta mi ha aiutato a risolvere il problema che stavo avendo. Quirks come questo può essere una sciocca perdita di tempo per risolvere i problemi. – ozz

+0

Volevo confermare che questo ha davvero risolto il mio problema! Stavo usando NSNumber (s) come chiave ma il dizionario non scriverà, dopo aver convertito i numeri in stringhe ha funzionato! Grazie, @Otuken! – Motasim

4

Vorrei aggiungere ancora un altro trucco che ho incontrato su Lion. La cartella in cui si desidera scrivere il plist deve esistere prima di chiamare il numero writeToFile:atomically: di NSDictionary. È possibile utilizzare NSFileManager per verificare l'esistenza e creare una nuova cartella, se necessario.

0

Avevo questo, come detto da altri, il dizionario non può essere salvato con alcuni tipi di dati (NULL notevoli).

Poiché il mio dizionario proveniva da un server (in forma di JSON) non potevo garantire ciò che conteneva, quindi ho salvato i dati RAW (da dataWithContentsOfURL) prima della serializzazione di JSON. A tal fine suppongo che tu possa convertire il dict in NSData e salvarlo - qualcosa del genere;

NSData *convetedData = [NSKeyedArchiver archivedDataWithRootObject:JSONDict]; 

E poi recuperare e riconvertire in questo modo.

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