Как мне заархивировать два объекта, используя NSKeyedArchiever? - PullRequest
1 голос
/ 29 июня 2011

Ранее у меня был массив, в котором я использую NSKeyedArchiver для архивирования.

[NSKeyedArchiver archiveRootObject:array toFile:docPath];

Вызывается на applicationWillTerminate и applicationDidEnterBackground.

При запуске в didFinishLaunchingWithOPtions, массив не получен:

NSMutableArray *array = [NSKeyedUnarchiver unarchiveObjectWithFile:docPath];

Все было хорошо.С тех пор я добавил класс Singleton для переменных настроек.Я хотел бы также заархивировать синглтон.Как мне это сделать?

Меня смущает то, что я вызываю одно и то же сообщение:

[NSKeyedArchiver archiveRootObject:singleton toFile:docPath];

Как приложение может узнать, какой объект я хочу разархивировать при вызове:

[NSKeyedUnarchiver unarchiveObjectWithFile:docPath];

Это массив или синглтон?

archiveRootObject принимает (id), который для меня означает все, что я хочу.Я могу создать класс данных, который включает в себя массив и синглтон.Это то, как я должен это сделать?Есть ли способ лучше?Любые предложения приветствуются.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 29 июня 2011

Для возможности архивирования ваш одноэлементный класс должен соответствовать протоколу NSCoding. Вам придется реализовать методы initWithCoder: и encodeWithCoder:.

Опять же, если вы сделаете archiveRootObject:toFile: для двух объектов с одинаковым путем к файлу, вы перезапишете один из них. Чтобы закодировать два объекта, вам нужно сделать что-то вроде этого,

NSData * data = [NSMutableData data];
NSKeyedArchiver * archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 
[archiver encodeObject:array forKey:@"Array"];
[archiver encodeObject:singleton forKey:@"Singleton"];
[archiver finishEncoding];
BOOL result = [data writeToFile:filePath atomically:YES];
[archiver release];

Подробнее об архивации вы можете прочитать в этом guide.

3 голосов
/ 29 июня 2011

Если вы хотите закодировать более одного объекта на корневом уровне, вам нужно создать архиватор, используя +alloc и -initForWritingWithMutableData:, отправив его -encodeObject: forKey: сообщения для каждого из объектов, которые вы хотите добавить в архив и наконец -finishEncoding. Затем вы можете записать данные в файл самостоятельно.

Это будет выглядеть примерно так ( предупреждение: непроверенный код впереди):

NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

[archiver encodeObject:someObject forKey:@"people"];
[archiver encodeObject:anotherObject forKey:@"places"];
[archiver encodeObject:thirdObject forKey:@"things"];
[archiver finishEncoding];

[data writeToURL:someUrl atomically:YES];
[archiver release];

Для извлечения объектов вы, по сути, делаете обратное: считываете файл в объект NSData; создайте NSKeyedUnarchiver с +alloc и -initForReadingWithData:; получить объекты, которые вам нужны, используя -decodeObjectForKey:; и, наконец, позвоните -finishDecoding. Вы можете почти прочитать образец сверху донизу с несколькими изменениями имени.

...