NSDictionary writeToFile - PullRequest
       1

NSDictionary writeToFile

9 голосов
/ 11 августа 2010

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

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

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

Код, который я использую, следующий:

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

[myDict writeToFile: fullPath  atomically:YES];

Ответы [ 4 ]

27 голосов
/ 12 ноября 2011

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

12 голосов
/ 11 августа 2010

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

Каково содержимое 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

4 голосов
/ 25 января 2012

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

0 голосов
/ 10 сентября 2013

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

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

NSData *convetedData = [NSKeyedArchiver archivedDataWithRootObject:JSONDict];

А затем позже получить и преобразовать обратно, как это.

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