Nsuserdefaults На Практике

Этот текст является переводом статьи 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:

Если есть настройка, управляющая какой-то частью кода, вы просто вызываете соответствующий метод получения ( -объектФорКей: или один из методов-оболочек для определенного типа).

Если вы обнаружите, что вам нужно сделать что-то еще, чтобы настроиться, вам следует сделать шаг назад и пересмотреть:

  1. Кэширование значений из NSUserDefaults обычно не требуется, так как чтение и так происходит крайне быстро
  2. На связи -синхронизировать перед чтением значения нет необходимости ни в каких ситуациях
  3. Действия в ответ на изменение значения практически никогда не нужны, поскольку цель любых настроек — контролировать то, что делает программа, а не принуждать к действию.

  4. Написание кода для обработки случая «значение не установлено» также обычно не требуется, поскольку можно зарегистрировать значение по умолчанию (см.

    ниже).

    Регистрация значения по умолчанию ).



Сохранение пользовательских настроек в NSUserDefaults

Аналогично, когда пользователь меняет некоторые настройки, вы просто вызываете -setObject:forKey: (или одну из его оберток для конкретного типа).

Если вы обнаружите, что вам нужно что-то еще, то, опять же, вероятно, вам это не нужно.

Почти никогда не стоит звонить -синхронизировать после установки значения (см.

ниже Обмен настройками между программами ).

И пользователи, как правило, не могут менять настройки достаточно быстро, чтобы какой-либо вид «пакетирования» был полезен для производительности.

Фактическая запись на диск происходит асинхронно, и NSUserDefaults автоматически объединяет изменения в одну операцию записи.



Регистрация значения по умолчанию

Может возникнуть соблазн написать такой код:
   

- (void) applicationDidFinishLaunching:(NSApplication *)app {

Теги: #перевод с английского #разработка для iOS #NSUserDefaults #Разработка для iOS #Разработка для MacOS
Вместе с данным постом часто просматривают: