Кодировать NSArray или NSDictionary с помощью NSCoder - PullRequest
18 голосов
/ 09 февраля 2010

Мне было интересно, возможно ли использовать метод NSCoder:

- (void)encodeObject:(id)objv forKey:(NSString *)key

для кодирования экземпляра NSArray или NSDictionary.Если нет, то как вы их кодируете?Я пытаюсь использовать NSKeyedArchived / NSKeyedUnarchiver для отправки данных между телефонами с помощью GameKit.Я попробовал это и не могу восстановить строку, которую я сохранил в своем массиве.Класс пакета, который я создал, идет вместе с целым числом типа пакета, но не данными в массиве, который кажется.

Заранее спасибо!

Ответы [ 3 ]

31 голосов
/ 09 февраля 2010

Если массив или словарь является корневым объектом, вы должны сделать

NSData * encodedData = [NSKeyedArchiver archivedDataWithRootObject:someArray];

или

BOOL success = [NSKeyedArchiver archiveRootObject:someArray toFile:filePath];

Если это переменная экземпляра пользовательского класса, в методе -encodeWithCoder: следует сделать

[coder encodeObject:someArray forKey:@"someArray"];

и затем в методе -initWithCoder:

someArray = [[coder decodeObjectForKey:@"someArray"] retain];
21 голосов
/ 09 февраля 2010

Какие объекты вы храните в массиве? Убедитесь, что все объекты, хранящиеся в массиве, реализуют протокол NSCoding.

10 голосов
/ 09 февраля 2010

NSKeyedArchiver / Unarchiver должен без проблем кодировать и декодировать NSArrays и NSDictionaries. Если созданный вами класс пакета реализует протокол NSCoding, вам необходимо явно вызвать [encodeObject:myNsArrayforKey:@"stringsArray"] в вашем методе -encodeWithCoder: (при условии, что myNsArray имя переменной экземпляра в вашем объекте пакета, который вы хотите закодировать). Но тогда архиватор и NSArray должны позаботиться об остальном. Если вы делаете это, было бы полезно узнать больше о расположении ваших классов и о том, кто кому звонит при кодировании / декодировании.

...