Создание и извлечение архивов
В этой главе описываются, как создать и извлечь архив. Чтобы понять, как заставить Ваши пользовательские объекты поддерживать архивацию, посмотрите Кодирование и Декодирование Объектов.
Создание архива
Самый простой способ создать архив графа объектов состоит в том, чтобы вызвать метод единого класса — также 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"]; |