Кодировать NSArray или NSDictionary с помощью NSCoder
Мне было интересно, можно ли использовать метод NSCoder:
- (void)encodeObject:(id)objv forKey:(NSString *)key
для кодирования либо экземпляра NSArray, либо NSDictionary. Если не так, как вы собираетесь их кодировать? Я пытаюсь использовать NSKeyedArchived/NSKeyedUnarchiver для отправки данных между телефонами с помощью GameKit. Я попробовал это и не могу найти строку, которую я сохранил в своем массиве. Выделенный класс пакета прошел вместе с целым числом типа пакета, но не такими данными в массиве.
Спасибо заранее!
Ответы
Ответ 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.