Подтвердить что ты не робот

Кодировать NSArray или NSDictionary с помощью NSCoder

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

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

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

Спасибо заранее!

4b9b3361

Ответ 1

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

Ответ 2

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

NSData * encodedData = [NSKeyedArchiver archivedDataWithRootObject:someArray];

или

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

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

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

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

someArray = [[coder decodeObjectForKey:@"someArray"] retain];

Ответ 3

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