2010-02-09 2 views
17

мне было интересно, является ли возможным использовать метод NSCoder:Закодировать NSArray или NSDictionary использованием NSCoder

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

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

Заранее благодарен!

+0

Это обычное NSManagedObject .... Я думаю, что для этого нужно использовать XML или JSON, но мне нужно узнать, как D: –

ответ

10

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

31

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

NSData * encodedData = [NSKeyedArchiver archivedDataWithRootObject:someArray]; 

или

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

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

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

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

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

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