Создание и извлечение архивов

В этой главе описываются, как создать и извлечь архив. Чтобы понять, как заставить Ваши пользовательские объекты поддерживать архивацию, посмотрите Кодирование и Декодирование Объектов.

Создание архива

Самый простой способ создать архив графа объектов состоит в том, чтобы вызвать метод единого класса — также archiveRootObject:toFile: или archivedDataWithRootObject:— на archiver классе. Эти удобные методы создают временный объект archiver, кодирующий график отдельного объекта; Вы не должны делать больше. Следующий фрагмент кода, например, архивирует пользовательский объект, названный aPerson непосредственно к файлу.

Person *aPerson = <#Get a Person#>;
NSString *archivePath = <Path for the archive#>;
BOOL success = [NSKeyedArchiver archiveRootObject:aPerson toFile:archivePath];

Однако, если Вы хотите настроить процесс архивации (например, путем заменения определенными классами других), необходимо вместо этого создать экземпляр archiver сами, сконфигурировать его, как желаемый и отправить его encode обменивайтесь сообщениями явно. NSCoder самостоятельно не определяет определенного метода для создания кодера; это обычно меняется в зависимости от подкласса. NSKeyedArchiver определяет initForWritingWithMutableData:.

Как только у Вас есть сконфигурированный объект кодера, для кодирования объектного или элемента данных, используйте любого encode метод для NSKeyedArchiver кодер. Когда закончено кодируя, необходимо вызвать finishEncoding прежде, чем получить доступ к архивным данным. Следующий фрагмент примера кода архивирует пользовательский объект, названный aPerson подобный вышеупомянутому коду, но допускает настройку.

Person *aPerson = <#Get a Person#>;
NSString *archivePath = <Path for the archive#>;
NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:aPerson forKey:ASCPersonKey];
[archiver finishEncoding];
 
NSURL *archiveURL = <URL for the archive#>;
BOOL result = [data writeToURL:archiveURL atomically:YES];

Возможно создать архив, не содержащий объектов. Для архивации других типов данных вызовите один из специфичных для типа методов, такой как encodeInteger:forKey: или encodeDouble:forKey: непосредственно для каждого элемента данных, который будет заархивирован вместо использования encodeRootObject:.

Декодирование архива

Самый простой способ декодировать архив объекта состоит в том, чтобы вызвать метод единого класса — также unarchiveObjectWithFile: или unarchiveObjectWithData:— на unarchiver классе. Эти удобные методы создают временный объект unarchiver, декодирующий и возвращающий график отдельного объекта; Вы не должны делать больше. NSKeyedUnarchiver требует, чтобы граф объектов в архиве был закодирован с одним из NSKeyedArchiverметоды класса удобства, такой как archiveRootObject:toFile:. Следующий фрагмент кода, например, разархивировал пользовательский объект, названный aPerson непосредственно от файла.

NSString *archivePath = <Path for the archive#>;
Person *aPerson = [NSKeyedUnarchiver unarchiveObjectWithFile:archivePath];

Однако, если Вы хотите настроить процесс разархивирования (например, путем заменения определенными классами других), Вы обычно создаете экземпляр unarchiver класса сами, конфигурируете его, как желаемый и отправляете ему a decodeобменивайтесь сообщениями явно. NSCoder самостоятельно не определяет определенного метода для создания кодера; это обычно меняется в зависимости от подкласса. NSKeyedUnarchiver определяет initForReadingWithData:.

Как только у Вас есть сконфигурированный объект декодера, для декодирования объектного или элемента данных, используйте decodeObjectForKey: метод. Закончено декодируя включенный архив, необходимо вызвать finishDecoding прежде, чем выпустить unarchiver. Следующий фрагмент примера кода разархивировал пользовательский объект, названный myMap подобный вышеупомянутому примеру кода, но допускает настройку.

NSURL *archiveURL = <URL for the archive#>;
NSData *data = [NSData dataWithContentsOfURL:archiveURL];
 
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
// Customize the unarchiver.
Person *aPerson = [unarchiver decodeObjectForKey:ASCPersonKey];
[unarchiver finishDecoding];

Можно создать архив, не содержащий объектов. Для разархивирования нетипов данных Object просто используйте decode... метод (такой как decodeIntForKey: или decodeDoubleForKey:) соответствие оригиналу encode... метод для каждого элемента данных, который будет разархивирован.

Настроить процесс разархивирования для архива ранее создало использование archiveRootObject:toFile:, использовать decodeObjectForKey: и ключевой «корень» для идентификации корневого объекта в архиве:

id object = [unarchiver decodeObjectForKey:@"root"];