Чтение и запись данных списка свойств
Используя методы Objective C, чтобы читать и записать данные списка свойств
У Вас есть два главных способа записать данные списка свойств в файловую систему:
Если корневой объект списка свойств
NSDictionary
илиNSArray
объект — который почти всегда имеет место — можно вызватьwriteToFile:atomically:
илиwriteToURL:atomically:
методы тех классов, передающих в корневом объекте. Эти методы сохраняют график объектов списка свойств как список свойств XML перед выписыванием что как ресурс URL или файл.Для чтения данных списка свойств назад в программу инициализируйте выделенный объект коллекции путем вызова
initWithContentsOfFile:
иinitWithContentsOfURL:
методы или соответствующие методы фабрики классов (например,dictionaryWithContentsOfURL:
).Можно сериализировать объекты списка свойств к
NSData
объект с помощьюdataFromPropertyList:format:errorDescription:
метод класса и затем сохраните тот объект путем вызоваwriteToFile:atomically:
илиwriteToURL:atomically:
методыNSData
класс.Для чтения данных списка свойств назад в программу сначала инициализируйте выделенный
NSData
объект путем вызоваinitWithContentsOfFile:
илиinitWithContentsOfURL:
или вызовите соответствующий метод фабрики классов такой какdataWithContentsOfFile:
. Тогда вызовитеpropertyListFromData:mutabilityOption:format:errorDescription:
метод классаNSPropertyListSerialization
, передача в объекте данных.
Первый подход более прост — требуется только один вызов метода вместо два — но второй подход имеет свои преимущества. Это позволяет Вам преобразовывать список свойства времени выполнения в двоичный формат, а также список свойств XML. При преобразовании статического представления списка свойств назад в график объектов это также позволяет Вам указать с большей гибкостью, являются ли те объекты непостоянными или неизменными.
Чтобы подробно остановиться на этой последней точке, рассмотрите этот пример. У Вас есть список свойств XML, корневой объект которого NSArray
объект, содержащий много NSDictionary
объекты. Если Вы загружаете тот список свойств этим вызовом:
NSArray * a = [NSArray arrayWithContentsOfFile:xmlFile]; |
a
неизменный массив с неизменными словарями в каждом элементе. Каждый ключ и каждое значение в каждом словаре являются также неизменными.
Если Вы загружаете список свойств этим вызовом:
NSMutableArray * ma = [NSMutableArray arrayWithContentsOfFile:xmlFile]; |
ma
непостоянный массив с неизменными словарями в каждом элементе. Каждый ключ и каждое значение в каждом словаре являются неизменными.
При необходимости в управлении с более прекрасными зернами переменчивостью объектов в списке свойств используйте propertyListFromData:mutabilityOption:format:errorDescription:
метод класса, второй параметр которого разрешает Вам указывать переменчивость объектов на различных уровнях совокупного списка свойств. Вы могли указать, что все объекты являются неизменными (NSPropertyListImmutable
), то единственное контейнер (массив и словарь) объекты является непостоянным (NSPropertyListMutableContainers
), или что все объекты являются непостоянными (NSPropertyListMutableContainersAndLeaves
).
Например, Вы могли записать код как это:
NSMutableArray *dma = (NSMutableArray *)[NSPropertyListSerialization |
propertyListFromData:plistData |
mutabilityOption:NSPropertyListMutableContainersAndLeaves |
format:&format |
errorDescription:&error]; |
Этот вызов производит непостоянный массив с непостоянными словарями в каждом элементе. Каждый ключ и каждое значение в каждом словаре являются самостоятельно также непостоянными.
Используя базовые функции основы, чтобы читать и записать данные списка свойств
Чтобы выписать использованию списков свойств XML Property List Services (Базовая Основа), вызовите функцию CFURLWriteDataAndPropertiesToResource
функция, передавая объект CFData создается посредством вызова CFPropertyListCreateXMLData
. Для чтения списка свойств XML из файловой системы или ресурса URL вызовите функцию CFURLCreateDataAndPropertiesFromResource
. Тогда преобразуйте создаваемый объект CFData в график объектов списка свойств путем вызова CFPropertyListCreateFromXMLData
функция.
Перечисление 6-1 включает фрагмент большего примера кода в Сохранении и Восстановлении Списка свойств в Базовой Основе, иллюстрирующей использование этих функций.
Перечисление 6-1 Пишущие и читающие списки свойств с помощью Базовых функций Основы
void WriteMyPropertyListToFile( CFPropertyListRef propertyList, |
CFURLRef fileURL ) { |
CFDataRef xmlData; |
Boolean status; |
SInt32 errorCode; |
// Convert the property list into XML data. |
xmlData = CFPropertyListCreateXMLData( kCFAllocatorDefault, propertyList ); |
// Write the XML data to the file. |
status = CFURLWriteDataAndPropertiesToResource ( |
fileURL, // URL to use |
xmlData, // data to write |
NULL, |
&errorCode); |
CFRelease(xmlData); |
} |
CFPropertyListRef CreateMyPropertyListFromFile( CFURLRef fileURL ) { |
CFPropertyListRef propertyList; |
CFStringRef errorString; |
CFDataRef resourceData; |
Boolean status; |
SInt32 errorCode; |
// Read the XML file. |
status = CFURLCreateDataAndPropertiesFromResource( |
kCFAllocatorDefault, |
fileURL, |
&resourceData, // place to put file data |
NULL, |
NULL, |
&errorCode); |
// Reconstitute the dictionary using the XML data. |
propertyList = CFPropertyListCreateFromXMLData( kCFAllocatorDefault, |
resourceData, |
kCFPropertyListImmutable, |
&errorString); |
if (resourceData) { |
CFRelease( resourceData ); |
else { |
CFRelease( errorString ); |
} |
return propertyList; |
} |
Можно также записать и считать списки свойств в файловую систему с помощью функций CFPropertyListWriteToStream
и CFPropertyListCreateFromStream
. Эти функции требуют, чтобы Вы открыли и сконфигурировали чтение и потоки записи сами.