2010-08-11 19 views
9

Gibt es eine Größenbeschränkung für das Speichern von Wörterbüchern?NSDictionary writeToFile

Ich versuche, ein ziemlich großes Wörterbuch mit etwa 100 Schlüssel mit verschachtelten Wörterbüchern mit writeToFile zu schreiben: aber es schreibt nie und ist immer falsch.

Ist dies eine Einschränkung oder mache ich etwas falsch,

Der Code ich verwende, ist die folgende.

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

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

Sind Sie sicher, dass Sie keine nicht codierbaren Objekte im Verzeichnisbaum eingebettet haben? Theres eine begrenzte Menge von Objekten, die NSCoding entsprechen. Überprüfen Sie in der Konsole ich habe das Gefühl, dass es die beleidigende Objekt Details in dort, wenn das der Fall ist. –

Antwort

12

Es gibt keine Größenbeschränkung (außer Speicher und Speicherplatz).

Was ist der Inhalt von ?

Wenn es sich um alles andere als die in Klassenlisten erlaubte kleine Gruppe von Klassen handelt, können Sie writeToFile:atomically: nicht verwenden.

Entweder müssten Sie Ihr Wörterbuch auf nur Instanzen dieser Klassen oder beschränken, Sie müssen eine andere Archivierungsmethode verwenden.

Insbesondere viele JSON-Bibliotheken werden NSNULL Instanzen in die Sammlungen speien. Diese können nicht archiviert werden. Sie müssen sie entweder bearbeiten oder durch Objekte ersetzen, die archivieren können.

Relevant:

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

Ich hatte das gleiche Problem und das Problem war [NSNull null] -Objekt im Wörterbuch :) – yasirmturk

+0

@yasirmturk - Das hat es geschafft! Vielen Dank. – Myxtic

27

Es gibt einen weiteren Trick, um diese, neben der Verwendung nur qualifizierte Objekte (Instanzen von NSNumber, NSString, NSData usw.) die Schlüssel haben NSString sein Objekte. Normalerweise können Sie ein beliebiges Objekt für den NSDictionary-Schlüssel verwenden, aber eine erfolgreiche writeToFile-Anweisung: Die Schlüssel im NSDictionary müssen NSString-Instanzen sein.

+7

Ich hatte Probleme beim Speichern eines NSDictionary mit writeToFile, diese Antwort half mir, das Problem zu lösen, das ich hatte. Quarks wie diese können so eine alberne Zeitverschwendung sein, um Fehler zu beheben. – ozz

+0

Wollte bestätigen, dass dies tatsächlich mein Problem gelöst hat! Ich benutzte NSNumber (s) als Schlüssel, aber das Wörterbuch wird nicht schreiben, nach dem Umwandeln der Zahlen in Strings funktionierte es! Danke, @Otuken! – Motasim

4

Ich würde noch einen Trick hinzufügen, den ich auf Lion traf. Der Ordner, in den Sie den PLIST schreiben möchten, muss vorhanden sein, bevor Sie NSDictionary's writeToFile:atomically: aufrufen. Sie können NSFileManager verwenden, um das Vorhandensein zu testen und bei Bedarf einen neuen Ordner zu erstellen.

0

Ich hatte dies, wie von anderen erwähnt das Wörterbuch kann nicht mit einigen Datentypen gespeichert werden (beachten Sie NULL).

Da mein Wörterbuch von einem Server (in Form von JSON) war, konnte ich nicht garantieren, was darin war, also speicherte ich die RAW-Daten (aus dem DataWithContentsOfURL) vor der Serialisierung des JSON. Zu diesem Zweck vermute ich, dass Sie das Diktat in NSData konvertieren und speichern könnten - so etwas wie;

NSData *convetedData = [NSKeyedArchiver archivedDataWithRootObject:JSONDict]; 

Und dann später abrufen und zurück wie folgt konvertieren.

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