Чтение и запись данных списка свойств

Используя методы Objective C, чтобы читать и записать данные списка свойств

У Вас есть два главных способа записать данные списка свойств в файловую систему:

Первый подход более прост — требуется только один вызов метода вместо два — но второй подход имеет свои преимущества. Это позволяет Вам преобразовывать список свойства времени выполнения в двоичный формат, а также список свойств 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. Эти функции требуют, чтобы Вы открыли и сконфигурировали чтение и потоки записи сами.