Предпочтительные методы наиболее успешной практики
CFPreferences является стандартный API Apple для того, чтобы сохранить и получить предпочтительные ключи и значения, позволяя обработке вызовов сконцентрироваться на собственных типах и значениях пары ключ/значение, а не механизмах записи в файлы и т.д. В то время как это обеспечивает удобный API, это также просто в использовании неправильно. Этот документ дает обзор того, когда является надлежащим использовать то, что API, и как синхронизировать предпочтения через границы процесса.
Когда использовать что API
Следующие общие руководящие принципы применяются к API CFPreferences:
Необходимо обычно использовать
CFPreferencesCopyAppValue
считать предпочтительные ключи.Необходимо использовать
CFPreferencesSetAppValue
записать предпочтительные ключи для “текущего пользовательского/любого узла”.Если необходимо записать предпочтение узлом текущего пользователя, использовать
CFPreferencesSetValue
. Удостоверьтесь, что это абсолютно необходимо.
Обратите внимание на то, что, несмотря на то, что они обрабатываются отдельно в документации, высокоуровневый API и низкоуровневый API не являются монопольными. Может быть надлежащим использовать высокоуровневый API в некоторых частях приложения и низкоуровневый API в другом. Например, можно установить предпочтительную пару ключ/значение с CFPreferencesSetValue(key, value, app, user, host)
и затем считайте его с CFPreferencesCopyAppValue(key, value, app)
— действительно Вы, вероятно, хотите считать его с последней функцией, так как это пересекает путь поиска.
Высокий уровень API
Как можно больше, необходимо использовать CFPreferencesCopyAppValue
получать предпочтительные ключи. Эта функция пересекает путь поиска, ища соответствующий ключ и возвращает значение из самого специфичного домена.
Пользователи определенных машин могут также подвергнуться «управлению» через “менеджера по Рабочей группе” или опцию «Capabilities» предпочтительной области Учетных записей в Установках системы. Любой из этих механизмов может вызвать предпочтительные значения на пользователе. Эти значения также взяты CFPreferencesCopyAppValue
API — необходимо использовать эту функцию, чтобы гарантировать, что приложение должным образом реагирует на управление этим видом.
Низкий уровень API
Если Ваше приложение должно различить “текущий узел” и “какой-либо узел”, тогда Вы используете низкий уровень API. Если по некоторым причинам необходимо искать пару ключ/значение в определенном домене, необходимо использовать CFPreferencesCopyValue
— Вы не должны использовать эту функцию в качестве общего механизма извлечения.
Синхронизация предпочтений через границы процесса
Эмпирическое правило на синхронизации CFPreferences:
Только синхронизируйтесь при необходимости
Если необходимо связаться через границы процесса, используйте уведомления с надлежащей гранулярностью, сохраняя 1) в памяти. Как правило, это означает устанавливать флаг в клиентских процессах, и только если измененный ключ требуется, должен Вы инициировать синхронизирование.
Много процессов в OS X пишут предпочтительную пару ключ/значение для использования в другом процессе. В то время как это было бы удобно для предпочтительных пар ключ/значение для автоматического обновления в других процессах, гарантировав, что автоматическое обновление при всех обстоятельствах будет подвергаться потере производительности и также мешать гарантировать, что связанные предпочтения читаются и последовательно пишутся. Процессы должны всегда иметь выбор того, когда выбрать принимать новую информацию в их пространство. Для предпочтительных значений, CFPreferencesSynchronize
и CFPreferencesAppSynchronize
вызовы функции что, обеспечивая информационное узкое горло. Вы не должны обычно, однако, вызывать эти функции перед каждым чтением предпочтительного ключа.
Предпочтительное расположение файлов и отладка
Предпочтительные файлы хранятся в предпочтительных каталогах системы или пользователя. На версиях OS X 10.0 к 10,4 они находятся в /Library/Preferences
и в /Library/Preferences
в корневом каталоге пользователя соответственно. При отладке приложения может иногда быть полезно проверить эти файлы, чтобы решить, что предпочтения были сохранены правильно, однако Вы никогда не должны hardcode эти пути в приложение. Если действительно необходимо получить доступ к каталогу программно, необходимо использовать NSSearchPathForDirectoriesInDomains
API, несмотря на то, что не должно обычно быть никакой причины сделать так.
Обратите внимание на то, что предпочтения, которые Вы устанавливаете в регистрационном домене (см. Домены Значений по умолчанию в Руководстве по программированию Предпочтений и Настроек) не сохранены в предпочтительном файле. Другими словами, предпочтительные хранилища файлов только оценивает, которые отличаются от тех в регистрационном домене, таким образом, Вы не должны ожидать видеть “значения по умолчанию по умолчанию” в предпочтительном файле после запуска приложения.
Управляемые предпочтения
OS X v10.2 представил понятие “управляемых предпочтений”. Функция CFPreferencesAppValueIsForced
определяет, был ли данный ключ наложен на пользователя. Для управляемых ключей необходимо отключить любой пользовательский интерфейс, позволяющий пользователю изменять значение для ключа.