2010-08-11 5 views
9

Есть ли ограничение по размеру для сохранения словарей?NSDictionary writeToFile

Я пытаюсь написать довольно большой словарь с около 100 ключами с вложенными словарями с использованием writeToFile: но он никогда не пишет и всегда является ложным.

Является ли это ограничение или я делаю что-то неправильное,

код я использую следующее.

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

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

Уверены ли вы, что в дереве словаря нет встроенных элементов, не подлежащих кодированию. Theres ограниченный набор объектов, соответствующих NSCoding. У меня есть проверка на консоли. У меня есть ощущение, что она закрывает оскорбительную деталь объекта там, если это так. –

ответ

12

Ограничение по размеру (кроме памяти и дискового пространства).

Какое содержимое myDict?

Если в списках свойств имеется только небольшой набор классов, то вы не можете использовать writeToFile:atomically:.

Либо вам нужно будет ограничить словарь только содержащими экземпляры этих классов или, вам нужно будет использовать другой способ архивации.

В частности, многие библиотеки JSON будут израсходовать NSNULL экземпляров в коллекциях. Они не могут быть заархивированы. Вам нужно либо отредактировать их, либо заменить их объектами, которые может быть заархивирован.

Актуальными:

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

У меня была та же проблема, и проблема была в [словаре NSNull null] в словаре :) – yasirmturk

+0

@yasirmturk - Это было! Благодарю. – Myxtic

27

Существует еще один трюк для этого, помимо использования только правомочные объекты (экземпляры NSNumber, NSString, NSData и т.д.) ключи должны быть NSString объекты. Обычно вы можете использовать любой объект для ключа NSDictionary, но иметь успешный writeToFile: ключи в NSDictionary должны быть экземплярами NSString.

+7

Мне не удалось сохранить NSDictionary с помощью writeToFile, этот ответ помог мне решить проблему, с которой я столкнулся. Подобные причуды могут быть такой глупой тратой времени на устранение неполадок. – ozz

+0

Хотел подтвердить, что это действительно решило мою проблему! Я использовал NSNumber (s) как ключ, но словарь не будет писать после преобразования чисел в строки, в которых он работал! Спасибо, @ Отукен! – Motasim

4

Я бы добавил еще один трюк, который я натолкнулся на Льва. Папка, которую вы хотите написать plist, должна существовать до того, как вы вызовете NSDictionary's writeToFile:atomically:. Вы можете использовать NSFileManager для проверки существования и при необходимости создать новую папку.

0

У меня было это, как упоминалось другими, словарь не может быть сохранен с некоторыми типами данных (примечание NULL).

Поскольку мой словарь был с сервера (в форме JSON), я не мог гарантировать, что было в нем, поэтому я сохранил данные RAW (из dataWithContentsOfURL) перед сериализацией JSON. С этой целью я предполагаю, что вы можете преобразовать dict в NSData и сохранить это - что-то вроде;

NSData *convetedData = [NSKeyedArchiver archivedDataWithRootObject:JSONDict]; 

И затем позже восстановить и преобразовать назад, как это.

NSDictionary *JSONDict = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithData:convertedDATA]; 
Смежные вопросы