Используя высокоуровневые предпочтения API
Функции CFPreferencesSetAppValue
и CFPreferencesCopyAppValue
самый прямой путь к приложению, чтобы создать и получить предпочтение, которое является определенным для текущего пользователя и приложения. Предпочтительные данные записаны в домен по умолчанию (Текущий Пользователь, Текущее Приложение, Любой Узел) и таким образом, это будет доступно на всех машинах, что этот пользователь может войти в систему. Эти функции никогда не должны вызываться с kCFPreferencesAnyApplication
, только истинный идентификатор приложения или kCFPreferencesCurrentApplication
.
Сохранение простого предпочтения
Предпочтения сохранены как пары ключ/значение. Ключ должен быть объектом CFString, но значение может быть любым Базовым значением списка свойств Основы (см., что Список свойств Программирует Темы для Базовой Основы), включая контейнерные типы. Например, Вам можно было бы вызвать ключ defaultWindowWidth
который определяет ширину в пикселях любых новых окон, которые создает Ваше приложение. Его значение наиболее вероятно имело бы тип CFNumber. Вы могли бы также решить объединить ширину окна и высоту в единственное вызванное предпочтение defaultWindowSize
и заставьте его значение быть объектом CFArray, содержащим два объекта CFNumber.
Код в Перечислении 1 демонстрирует, как создать простое предпочтение приложения «MyTextEditor». Пример устанавливает цвет текста по умолчанию для приложения к синему.
Перечисление 1 Пишущий простое значение по умолчанию
CFStringRef textColorKey = CFSTR("defaultTextColor"); |
CFStringRef colorBLUE = CFSTR("BLUE"); |
// Set up the preference. |
CFPreferencesSetAppValue(textColorKey, colorBLUE, |
kCFPreferencesCurrentApplication); |
// Write out the preference data. |
CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication); |
Заметьте это CFPreferencesSetAppValue
отдельно не достаточно для создания нового предпочтения. Вызов к CFPreferencesAppSynchronize
требуется, чтобы фактически сохранять значение. Если Вы пишете многократные предпочтения, более эффективно синхронизировать только один раз после того, как последнее значение было установлено, чем синхронизировать после того, как установлено каждое отдельное значение. Например, когда пользователь нажимает кнопку «OK», при реализации предпочтительной панели, Вы могли бы только синхронизироваться. В других случаях Вы не могли бы хотеть синхронизировать вообще, до выходов приложения — несмотря на то, что примечание, что, конечно, если сбои приложения будут потеряны все несохраненные предпочтительные настройки.
Чтение простого предпочтения.
Самый простой способ расположиться и получить предпочтительное значение состоит в том, чтобы использовать CFPreferencesCopyAppValue
функция. Этот вызов перерывает различные предпочтительные домены в порядке, пока это не находит ключ, который Вы указали. Если предпочтение было установлено в менее специфичном домене —” Каком-либо Приложении”, например — его значение будет получено с этим вызовом, если не может быть найдена более определенная версия. Перечисление 2 показывает, как получить предпочтение цвета текста, сохраненное в Перечислении 1.
Перечисление 2 Читая простое значение по умолчанию
CFStringRef textColorKey = CFSTR("defaultTextColor"); |
CFStringRef textColor; |
// Read the preference. |
textColor = (CFStringRef)CFPreferencesCopyAppValue(textColorKey, |
kCFPreferencesCurrentApplication); |
// When finished with value, you must release it |
// CFRelease(textColor); |
Даже если Вы только что установили значение с помощью непостоянного объекта, Обратите внимание на то, что все значения, возвращенные из предпочтений, являются неизменными.
Обновление простого предпочтения
Примером простого предпочтительного обновления является игра, ищущая высокое предпочтение счета каждый раз, когда раунд завершается. Если нет никакого высокого предпочтения счета, приложение пишет текущий счет как высокий счет. Если высокое предпочтение счета существует, это по сравнению с новым счетом и обновлено, если новый счет выше. Перечисление 3 демонстрирует этот процесс.
Перечисление 3 , Обновляющее предпочтение
CFStringRef highScoreKey = CFSTR("High Score"); |
CFNumberRef tempScore; |
int highScore; |
// Look for the preference. |
tempScore = (CFNumberRef)CFPreferencesCopyAppValue(highScoreKey, |
kCFPreferencesCurrentApplication); |
// If the preference exists, update it. If not, create it. |
if (tempScore) |
{ |
// Numbers come out of preferences as CFNumber objects. |
if (!CFNumberGetValue(tempScore, kCFNumberIntType, &highScore)) { |
highScore = 0; |
} |
CFRelease(tempScore); |
printf("The old high score was %d.", highScore); |
} |
else |
{ |
// No previous value. |
printf("There is no old high score."); |
highScore = 0; |
} |
highScore += 5; |
// Create the CFNumber to pass to the preference API. |
tempScore = CFNumberCreate(NULL, kCFNumberIntType, &highScore); |
// Set the preference value, or update it if it already exists. |
CFPreferencesSetAppValue(highScoreKey, tempScore, |
kCFPreferencesCurrentApplication); |
// Release the CFNumber. |
CFRelease(tempScore); |
// Write out the preferences. |
CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication); |
Метод, показанный в Перечислении 3, делает вывод к контексту многократных предпочтений, где приложение пытается определить местоположение ряда предпочтений дисплея пользователю в графической предпочтительной панели. Если никакие предпочтения не существуют, значения по умолчанию используются. Если существующие предпочтительные значения найдены, они используются для инициализации предпочтительной панели для дисплея пользователю. После того, как пользователь вносит изменения и нажимает кнопку «OK», можно установить измененные предпочтительные значения и записать им в хранение.