Этот текст является переводом статьи NSUserDefaults на практике .
Первоначальный автор — Дэвид Смит. Перевод выполнен с любезного разрешения автора.
Что такое NSUserDefaults?
Комментарий, который начинается с заголовочного файла «NSUserDefaults.h», довольно хорошо описывает класс.Для начала я воспользуюсь этим комментарием:
NSUserDefaults: 1) иерархический 2) постоянный (постоянный) 3) межпроцессный 4) и в некоторых случаях распределены хранилище ключей-значений.NSUserDefaults оптимизированы для хранения пользовательских настроек.
1) Иерархический:
NSUserDefaults содержат список мест хранения данных, в которых они ищут эти данные.Этот список называется «списком поиска».
«Список поиска» содержит произвольные строки, называемые «идентификаторами пакета» или «идентификаторами домена».
Когда поступает запрос, NSUserDefaults проверяет каждый элемент в своем списке поиска, пока не найдет тот, который содержит ключ из запроса, или пока не пройдет весь список.
В список входят:
- Управляемые («принудительные») настройки, устанавливаемые профилем конфигурации или сетевым администратором через MCX (управляемый клиент для OS X).
- Аргументы командной строки
- Настройки текущего домена в облаке
- Настройки текущего домена, текущего пользователя, на текущем хосте
- Настройки текущего домена, текущего пользователя, на любом хосте
- Настройки добавлены по звонку -addSuiteNamed:
- Настройки глобальные для всех приложений текущего пользователя, на текущем хосте.
- Настройки глобальные для всех приложений текущего пользователя, на любом хосте.
- Настройки текущего домена, для всех пользователей, на текущем хосте
- Настройки глобальные для всех приложений всех пользователей на текущем хосте.
- Настройки зарегистрированы через -registerDefaults:
Настройки «текущий хост + текущий пользователь» не реализованы в iOS, watchOS и tvOS, а настройки «любой пользователь» практически ничего не делают для приложений в этих операционных системах.
2) Постоянный (постоянный):
Настройки, сохраненные в NSUserDefaults, сохраняются при перезагрузках и перезапусках приложения, если не указано иное.
3) Межпроцессный:
Настройки можно читать/записывать из нескольких процессов одновременно (например, из приложения и его расширения).
4) В некоторых случаях распространяются:
В настоящее время поддержка доступна только для общего iPad для студентов (Apple www.apple.com/education/it — ок.перевод).
Данные, хранящиеся в NSUserDefaults, можно сделать распределенными («повсеместными» — прим.
пер.
), т.е.
синхронизировать между устройствами через облако.
Распределенные «пользовательские настройки» автоматически передаются на все устройства, вошедшие в одну учетную запись iCloud. При чтении настроек (вызовом таких методов, как -*ДляКлюча: ) распределенные настройки проверяются раньше локальных.
Все операции с распределенными настройками асинхронны.
Таким образом, если загрузка из iCloud не завершилась, вместо распределенных могут быть возвращены прописанные настройки.
Распределенные настройки задаются в файле конфигурации по умолчанию приложения.
Хранилище ключей-значений:
NSUserDefaults хранит объекты списка свойств (файлы plist): NSString, NSData, NSNumber, NSDate, NSArray и NSDictionary, идентифицируемые ключами типа NSString. Это похоже на то, как работает NSMutableDictionary.Оптимизировано для хранения пользовательских настроек:
NSUserDefaults предназначены для хранения относительно небольших объемов данных, к которым часто обращаются и которые редко изменяются.Другое использование может привести к снижению производительности или увеличению потребления памяти по сравнению с более подходящими решениями.
В CoreFoundation функции CFPreferences, содержащие «App» в имени, работают с теми же списками поиска, что и NSUserDefaults. Наблюдение за NSUserDefaults с помощью механизма KVO (Key-Value Observing) возможно для любого хранящегося в них ключа.
При наблюдении за изменениями в других процессах или устройствах использование NSKeyValueObservingOptionPrior не влияет на поведение KVO.
Основы NSUserDefaults: 99 %
В обычных обстоятельствах NSUserDefaults чрезвычайно просты.
Чтение настроек из NSUserDefaults:
Если есть настройка, управляющая какой-то частью кода, вы просто вызываете соответствующий метод получения ( -объектФорКей: или один из методов-оболочек для определенного типа).Если вы обнаружите, что вам нужно сделать что-то еще, чтобы настроиться, вам следует сделать шаг назад и пересмотреть:
- Кэширование значений из NSUserDefaults обычно не требуется, так как чтение и так происходит крайне быстро
- На связи -синхронизировать перед чтением значения нет необходимости ни в каких ситуациях
- Действия в ответ на изменение значения практически никогда не нужны, поскольку цель любых настроек — контролировать то, что делает программа, а не принуждать к действию.
- Написание кода для обработки случая «значение не установлено» также обычно не требуется, поскольку можно зарегистрировать значение по умолчанию (см.
ниже).
Регистрация значения по умолчанию ).
Сохранение пользовательских настроек в NSUserDefaults
Аналогично, когда пользователь меняет некоторые настройки, вы просто вызываете -setObject:forKey: (или одну из его оберток для конкретного типа).Если вы обнаружите, что вам нужно что-то еще, то, опять же, вероятно, вам это не нужно.
Почти никогда не стоит звонить -синхронизировать после установки значения (см.
ниже Обмен настройками между программами ).
И пользователи, как правило, не могут менять настройки достаточно быстро, чтобы какой-либо вид «пакетирования» был полезен для производительности.
Фактическая запись на диск происходит асинхронно, и NSUserDefaults автоматически объединяет изменения в одну операцию записи.
Регистрация значения по умолчанию
Может возникнуть соблазн написать такой код:Теги: #перевод с английского #разработка для iOS #NSUserDefaults #Разработка для iOS #Разработка для MacOS- (void) applicationDidFinishLaunching:(NSApplication *)app {
-
«Титаник» В Реалиях Xxi Века
19 Oct, 24 -
Соглашение Эйнштейна И Эйнсума
19 Oct, 24 -
Динамический Импорт В Javascript
19 Oct, 24