Userdefaults swift что это

NSUserDefaults на практике

Данный текст представляет собой перевод статьи NSUserDefaults In Practice. Автором оригинала является Дэвид Смит (David Smith). Перевод выполнен с любезного разрешения автора.

Что такое NSUserDefaults?

1) иерархическим
2) постоянным (персистентным)
3) межпроцессным
4) и в некоторых случаях распределенным
хранилищем вида ключ-значение. NSUserDefaults оптимизированы для хранения пользовательских настроек.

1) Иерархическое:

NSUserDefaults содержат список мест хранения данных, в котором они эти данные ищут. Этот список называется «список поиска». В «списке поиска» содержатся некоторые произвольные строки, называемые «идентификаторами набора»(suite identifier) или «идентификаторами домена». Когда поступает запрос NSUserDefaults проверяют каждый элемент в своем списке поиска, пока не найдут тот, который содержит ключ из запроса, или пока не пройдут весь список. Список включает:

2) Постоянное (персистентное):

Настройки сохраняемые в NSUserDefaults персистентны между перезагрузками и перезапусками приложений, если иное не указано.

3) Межпроцессные:

Настройки могут быть доступны на чтение/запись из нескольких процессов одновременно (например, из приложения и его расширения).

4) В некоторых случаях распределенные:

На данный момент поддержка есть только в режиме Shared iPad для учащихся (программа Apple www.apple.com/education/it — прим. перев.).

Данные сохраненные в NSUserDefaults могут быть сделаны распределенными («ubiqitous» — прим. перев.), т.е. синхронизирующимися между устройствами через облако. Распределенные «пользовательские настройки» автоматически передаются на все устройства залогиненные в один iCloud аккаунт. При чтении настроек (через вызов методов вида ) распределенные настройки проверяются перед локальными. Все операции с распределенными настройками асинхронные. Таким образом, если загрузка из iCloud не завершена, то зарегистрированные настройки могут быть возвращены, вместо распределенных. Распределенные настройки устанавливаются в конфигурационном файле настроек (Defaults Configuration File) приложения.

Хранилище ключ-значение:

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 производят слияние изменений в одну операцию записи автоматически.

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

Может показаться соблазнительным написать код наподобие:

Но в долгосрочной перспективе он имеет скрытый изъян: если когда-нибудь возникнет желание изменить начальное значение, у вас не будет способа отличить значение установленное пользователем (которое он хотел бы сохранить) и начальное значение установленное вами (которое хотелось бы изменить). Кроме того, делать так отчасти медленно. Решение — использовать метод можно вызывать сколько угодно раз. И все пары ключ-значение из всех переданных ему словарей будут зарегистрированы. Это дает возможность держать регистрацию настроек рядом с кодом, который с ними работает.

Разделение настроек между программами

Один сложный момент, который тем не менее часто встречается — это необходимость разделять настройки между несколькими запущенными процессами, например, между приложением и его расширением или между двумя и более приложениями (на macOS)

В старые (добрые/недобрые) времена, ещё до того как приложения стали помещать в «песочницы», всё было очень просто: используй с одинаковым именем в обоих процессах, и эти процессы станут разделять одни настройки. Терминологическое замечание: «домен» и «имя набора» используются как взаимозаменяемые. Оба термина обозначают просто произвольную строку, идентифицирующую хранилище настроек.

Моя основная рекомендация: разделять как можно меньше настроек — просто потому, что код проще понимать и поддерживать, когда значения не изменяются извне.

Транзакции в NSUserDefaults не реализованы, поэтому нет способа гарантировать, что результаты нескольких изменений станут доступны для чтения все разом. Другое приложение может увидеть результаты первых изменений до того как последующие изменения будут завершены.

Разделение настроек между устройствами

Распределенные (т.е. сохраняемые в iCloud) настройки сейчас поддерживаются только в режиме Shared iPad для обучения. Поэтому они вне сферы данного общего обсуждения. В настоящее время для распределенного хранения данных вне учебного режима следует использовать не NSUserDefaults, а NSUbiquitousKeyValueStore. Несколько нетривиальных моментов распределенных настроек упомянуты в разделе Ловушки и предостережения.

Ловушки и предостережения: StackOverflow направляет в этот раздел

Несмотря на поставленную во главу угла простоту, остается масса способов создать себе проблемы.

NSUserDefaults значительно улучшились за годы своего существования. Список ниже актуален для iOS 10 и macOS Sierra, но должен быть более длинным для старых систем, и, скорее всего, станет короче в будущих.

Продвинутые NSUserDefaults: вероятно вам это не нужно

Мешок с подарками-сюрпризами полный реже используемыми возможностями NSUserDefaults. Может содержать пчёл.

NSUserDefaults компромиссы производительности: ускоряемся

В общем, производительность NSUserDefaults достаточно хороша, чтобы вам не стоило о ней волноваться. Однако, есть несколько моментов, о которых стоит знать, если проблема возникает (пожалуйста, используйте профилировщик, наподобие утилиты «Инструменты», для проверки!)

При первом чтении любой настройки весь набор загружается в память. Это может занять значительное время на медленных системах. Следствия из этого:

Чтение уже загруженных настроек происходит чрезвычайно быстро: порядка половины микросекунды на 2012 MacBook Pro. Определенные вещи могут инвалидировать кэш и потребовать повторной загрузки: если набор разделяем с другим процессом, то установка настройки в любом из процессов инвалидирует кэш в обоих. В более типичном случае не разделенных настроек чтение настройки после установки создаст небольшие накладные расходы, но не полную перестройку кэша. Выводы отсюда:

Большая часть работы, вызываемой установкой настройки, является асинхронной. Но чтение может быть блокирующим, пока выполняется асинхронная запись. Вызов тоже блокирующий. Перемежающиеся операции установки и чтения большого разделенного набора — худший случай для производительности настроек.

Установка значения в коллекции внутри настроек вызовет установку всей коллекции (по всей видимости, акцент на «и не изменившейся части коллекции тоже» — прим. перев.). Поддержка «частичной записи» работает только для ключей верхнего уровня.

Установка значения (в конечном счете она асинхронна и случается несколько позднее в другом процессе) запишет весь plist на диск, неважно сколь малым было изменение. Избегайте хранения больших объемов данных, особенно при частых изменениях.

Источник

Обертки свойств в Swift с примерами кода

Перевод статьи подготовлен в рамках онлайн-курса «iOS Developer. Professional». Если вам интересно узнать подробнее о курсе, приходите на День открытых дверей онлайн.

Userdefaults swift что это. Смотреть фото Userdefaults swift что это. Смотреть картинку Userdefaults swift что это. Картинка про Userdefaults swift что это. Фото Userdefaults swift что это

Property Wrappers (Обертки Свойств) в Swift позволяют извлекать общую логику в отдельный объект-обертку. С момента представления во время WWDC 2019 и появления в Xcode 11 со Swift 5 было много примеров, которыми поделились в сообществе. Это изящное дополнение к библиотеке Swift, позволяющее удалить много шаблонного кода, который, вероятно, все мы писали в своих проектах.

Историю об обертках свойств можно найти на форумах Swift для SE-0258. В то время как целесообразность их использования в основном говорит о том, что обертки свойств являются решением для @NSCopying свойств, есть общая закономерность, которая реализовывается ими, и вы, вероятно, скоро все узнаете.

Что такое обертка свойства?

Обертку свойства можно рассматривать как дополнительный уровень, определяющий, как хранится или вычисляется свойство при чтении. Это особенно полезно для замены повторяющегося кода в геттерах и сеттерах свойств.

Типичным примером являются настраиваемые пользователем свойства по умолчанию, в которых пользовательские геттеры и сеттеры используются для соответствующего преобразования значения. Пример реализации может выглядеть следующим образом:

Оператор @UserDefault выполняет вызов обертки свойства. Как видите, мы можем задать ему несколько параметров, которые используются для настройки обертки свойства. Существует несколько способов взаимодействия с оберткой свойства, например, использование обернутого и прогнозируемого значения. Вы также можете настроить обертку с внедренными свойствами, о которых мы поговорим позже. Давайте сначала рассмотрим пример обертки свойства User Defaults.

Обертки свойств и UserDefaults

Он позволяет устанавливать и получать значения из пользовательских настроек по умолчанию из любого места следующим образом:

Это кажется отличным решением, но оно легко может превратиться в большой файл с множеством установленных ключей и свойств. Код повторяется и поэтому напрашивается способ сделать это проще. Пользовательская обертка свойств с использованием ключевого слова @propertyWrapper может помочь нам решить эту проблему.

Использование оберток свойств для удаления шаблонного кода

Если вы используете SwiftUI, возможно, вам лучше использовать обертку свойства AppStorage. Рассмотрим это просто как пример замены повторяющегося кода.

Обертка позволяет передать значение по умолчанию, если еще нет зарегистрированного значения. Мы можем передать любое значение, поскольку обертка определяется общим значением Value.

Теперь мы можем изменить нашу предыдущую имплементацию кода и создать следующее расширение для типа UserDefaults :

Как видите, мы можем использовать сгенерированный по умолчанию инициализатор struct из обертки определяемого свойства. Мы передаем тот же ключ, что и раньше, и устанавливаем значение по умолчанию false. Использовать это новое свойство очень просто:

В некоторых случаях вы захотите определить собственные пользовательские значения по умолчанию. Например, в случаях, когда у вас есть группа приложений, определяющая пользовательские значения по умолчанию. Наша установленная обертка по умолчанию использует стандартные пользовательские параметры по умолчанию, но вы можете переопределить их, чтобы использовать свой собственный контейнер:

Добавление дополнительных свойств с помощью одной обертки

В отличие от старого решения, при использовании обертки очень легко добавлять дополнительные свойства. Мы можем просто повторно использовать определенную обертку и инстанцировать столько свойств, сколько нам нужно.

Как вы можете видеть, обертка работает с любым типом, который вы определите, если этот тип поддерживается для сохранения в пользовательских настройках по умолчанию.

Хранение опционалов с помощью обертки свойств пользователя по умолчанию

Распространенная проблема, с которой можно столкнуться при использовании оберток свойств, заключается в том, что общее значение позволяет определить либо все опции, либо все значения без обертки. В сообществе существует распространенная техника решения этой проблемы, которая использует пользовательский протокол AnyOptional :

Это расширение создает дополнительный инициализатор, который устраняет требование определения значения по умолчанию и позволяет работать с опциями.

Наконец, нам нужно настроить наш установщик значений обертки, чтобы позволить удалять объекты из пользовательских значений по умолчанию:

Теперь это позволяет нам определять опционалы и принимать значения равными нулю:

Прогнозирование значения из обертки свойства

Теперь мы можем начать наблюдать за изменениями в нашем объекте следующим образом:

Это замечательно! Это позволяет нам реагировать на любые изменения. Поскольку до этого мы определяли наше свойство статически, теперь этот publisher будет работать во всем нашем приложении. Если вы хотите узнать больше о Combine, обязательно ознакомьтесь с моей статьей Начало работы с фреймворком Combine в Swift.

Определение образцов файлов с помощью обертки свойств

Приведенный выше пример в значительной степени сфокусирован на пользовательских настройках по умолчанию, но что если вы хотите определить другую обертку? Давайте рассмотрим еще один пример, который, надеюсь, подтолкнет вас к некоторым идеям.

Возьмем следующую обертку свойств, в которой мы определяем файл-образец:

Мы можем использовать эту обертку для определения файлов-образцов, которые могут понадобиться для отладки или при выполнении тестов:

Свойство projectedValue позволяет нам считывать имя файла, используемое в обертке свойства:

Это может быть полезно в тех случаях, когда вы хотите знать, какое начальное значение (значения) было использовано оберткой для вычисления конечного значения. Обратите внимание, что здесь мы используем знак доллара в качестве префикса для доступа к прогнозируемому значению.

Доступ к определенным приватным свойствам

Хотя не рекомендуется работать с обертками свойств таким образом, в некоторых случаях может оказаться полезным прочитать определенные свойства обертки. Я просто продемонстрирую, что это возможно, и вы, возможно, захотите переосмыслить свою реализацию кода, если у вас возникнет необходимость в доступе к приватным свойствам.

В приведенном выше примере мы можем получить доступ и к имени файла, используя префикс подчеркивания. Это позволяет нам получить доступ к приватному свойству filename :

Отнеситесь к этому со скептицизмом и посмотрите, не можете ли вы решить свои задачи, используя другие варианты решения.

Другие примеры использования

Вдохновившись этими встроенными примерами, вы можете начать думать о создании своих собственных оберток свойств. Другой идеей может быть создание обертки для выполнения действий в командной строке:

Или для представлений, макеты которых определены в коде:

Заключение

Обертки свойств — это отличный способ убрать шаблонные элементы в вашем коде. Приведенный выше пример — лишь один из многих сценариев, в которых они могут быть полезны. Вы можете опробовать его сами, найдя повторяющийся код и заменив его пользовательской оберткой.

Если вы хотите желаете узнать больше советов по Swift, загляните на страницу категории swift. Не стесняйтесь связаться со мной или написать мне в Twitter, если у вас есть дополнительные рекомендации или отзывы. Спасибо!

Источник

How to Use User Defaults in Swift

Swift 5 Xcode 11 ios 13

The defaults system is the easiest persistence solution on iOS, tvOS, macOS, iPadOS, and watchOS. A defaults database is nothing more than a key-value store. You interact with the defaults system through the UserDefaults class. Let’s take a look at the API of the UserDefaults class.

Shared Defaults Object

Most applications interact with the shared defaults object. You access the shared defaults object through the standard class property.

The user’s default database is written to disk as a property list or plist. A property list or plist is an XML file. The UserDefaults class keeps the contents of the property list in memory while your application is running to improve performance. It loads the property list once and writes any changes you make to disk.

Reading or Getting Values From User Defaults

Know that bool(forKey:) is a convenience method. The following expression has the same result, but it is less elegant and more verbose.

Writing or Setting Values To User Defaults

Creating or updating a key-value pair is trivial. You simply invoke the set(_:forKey:) method on the UserDefaults instance. In this example, we set the value of myKey to true by invoking the set(_:forKey:) method on the shared defaults object.

Data Types

Userdefaults swift что это. Смотреть фото Userdefaults swift что это. Смотреть картинку Userdefaults swift что это. Картинка про Userdefaults swift что это. Фото Userdefaults swift что это

You can store custom objects in the defaults database with a workaround, though. I explain that in this post.

When to Use User Defaults?

The defaults system is a good fit if you need to store small amounts of data that don’t need to be secured. For sensitive information, such as a username or an access token, I strongly recommend using the keychain. Even though you can store any type of data as binary data in the user’s defaults database, this approach isn’t recommended if you need to store large amounts of data.

Источник

How can I use UserDefaults in Swift?

How can I use UserDefaults to save/retrieve strings, booleans and other data in Swift?

Userdefaults swift что это. Смотреть фото Userdefaults swift что это. Смотреть картинку Userdefaults swift что это. Картинка про Userdefaults swift что это. Фото Userdefaults swift что это

Userdefaults swift что это. Смотреть фото Userdefaults swift что это. Смотреть картинку Userdefaults swift что это. Картинка про Userdefaults swift что это. Фото Userdefaults swift что это

13 Answers 13

Swift 3 and above

Store

Retrieve

Remove

Remove all Keys

Swift 2 and below

Store

Retrieve

Remove

Register

registerDefaults: adds the registrationDictionary to the last item in every search list. This means that after NSUserDefaults has looked for a value in every other valid location, it will look in registered defaults, making them useful as a «fallback» value. Registered defaults are never stored between runs of an application, and are visible only to the application that registers them.

Default values from Defaults Configuration Files will automatically be registered.

Register default values on app launch:

remove the value on app termination:

and check the condition as

UserDefaults suite name

another one property suite name, mostly its used for App Groups concept, the example scenario I taken from here :

The use case is that I want to separate my UserDefaults (different business logic may require Userdefaults to be grouped separately) by an identifier just like Android’s SharedPreferences. For example, when a user in my app clicks on logout button, I would want to clear his account related defaults but not location of the the device.

use of userDefaults synchronize, the detail info has added in the duplicate answer.

Источник

Русские Блоги

Swift-Use UserDefaults для локального хранения данных

UserDefaults подходит для хранения легких локальных клиентских данных, таких как функция запоминания пароля, для сохранения имени пользователя и пароля системы. Предпочтительно использование UserDefaults. В следующий раз, когда вы войдете в систему, вы сможете прочитать информацию о последней авторизации прямо из UserDefaults.

Вообще говоря, мы можем использовать базу данных SQlite для локального хранения данных или использовать созданный нами файл plist, но мы должны отображать создание и чтение файла самостоятельно, что очень хлопотно, но нас не волнует эти вещи при использовании UserDefaults. Как и при чтении строки, просто прочтите ее напрямую.

UserDefaults поддерживает множество форматов данных, в том числе: Int, Float, Double, BOOL, Array, Dictionary и даже Any type.

1. Ниже показано использование UserDefaults на примере:

(1) Если программа запускается впервые, используйте метод CFUUIDCreate, чтобы сгенерировать уникальную строку и сохранить ее как идентификатор пользователя (форма: B8DDB58D-73BF-4E39-A051-365858FC4626).

(2) Получите идентификатор пользователя прямо из UserDefaults при запуске позже

2. Хранение и чтение собственных типов данных.

3. Хранение и чтение системных объектов.

Системные объекты хранятся и должны быть преобразованы в Data как носитель с помощью метода archivedData, прежде чем их можно будет сохранить. В качестве примера возьмем объект UILabel:

4. Хранение и чтение пользовательских объектов.
Если вы хотите сохранить свой собственный определенный класс, вам сначала необходимо реализовать протокол NSCoding для архивирования и деархивирования (сериализации и десериализации) для этого класса. То есть добавьте к этому классу метод func encode (с coder: NSCoder) и метод init (coder decoder: NSCoder) для преобразования атрибутов.

5. Удалите объект хранения.
Сохраненные данные можно удалить с помощью метода removeObject (). Конечно, если объект хранения не существует, об ошибке не будет.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *