2011-06-29 1 views
1

Раньше у меня есть массив, в котором я использую NSKeyedArchiver для архивирования.Как архивировать два объекта с помощью NSKeyedArchiever?

[NSKeyedArchiver archiveRootObject:array toFile:docPath]; 

Призвал applicationWillTerminate и applicationDidEnterBackground.

При запуске в didFinishLaunchingWithOPtions, массив unarchieved:

NSMutableArray *array = [NSKeyedUnarchiver unarchiveObjectWithFile:docPath]; 

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

Та часть, которая сбивает с толку меня, если я называю то же сообщение:

[NSKeyedArchiver archiveRootObject:singleton toFile:docPath]; 

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

[NSKeyedUnarchiver unarchiveObjectWithFile:docPath]; 

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

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

Спасибо!

ответ

3

Если вы хотите кодировать более одного объекта на корневом уровне, вам необходимо создать архиватор, используя сами +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. Вы можете почти прочитать образец сверху снизу вверх с несколькими изменениями имени.

+0

Спасибо. Я постараюсь поиграть с ним, и я вернусь к вам с тем, что у меня есть. – okysabeni

+0

Чтобы разблокировать, я должен сделать NSData * data = [NSData dataWithContentsOfFile: путь]; затем [[NSKeyedUnarchiver alloc] initForReadingWithData: data]; Надеюсь, это поможет кому-то. – okysabeni

+0

Я могу архивировать и раскреплять правильно, но похоже, что класс Singleton не сохраняется из делегата приложения. Я разместил его как еще один вопрос: – okysabeni

3

Чтобы быть архивируемым, ваш класс Singleton должен соответствовать протоколу 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.

+0

+1 для отличного примера кода. ;-) – Caleb

+0

Спасибо за удивительный код и ссылку. – okysabeni

 Смежные вопросы

  • Нет связанных вопросов^_^