В настоящее время я работаю над приложением для iOS, разработанным в Swift, и мне нужно хранить какое-то пользовательское содержимое на устройстве, но я не могу найти простой и быстрый способ хранения / получения пользовательского контента на устройстве.
Может ли кто-нибудь объяснить, как хранить и получать доступ к локальному хранилищу?
Идея состоит в том, чтобы хранить данные, когда пользователь выполняет действие, и получать их при запуске приложения.
ios
swift
nsuserdefaults
Никлас Райдингвинг
источник
источник
Ответы:
Самое простое решение, если вы просто храните две строки, это то
NSUserDefaults
, что в Swift 3 этот класс был переименован в justUserDefaults
.Лучше всего хранить свои ключи где-нибудь на глобальном уровне, чтобы вы могли использовать их в другом месте своего кода.
Swift 3.0, 4.0 и 5.0
Swift 2.0
Для чего-либо более серьезного, чем второстепенные конфигурации, флаги или базовые строки, вы должны использовать какое-то постоянное хранилище. На данный момент популярным вариантом является Realm, но вы также можете использовать SQLite или Apple, имеющие собственные CoreData .
источник
setValue(_:forKey:)
для сохранения данных в UserDefaults. Используйте предоставленныеUserDefaults
методыset(_:forKey:)
(в Swift 3).Они говорят, что используют NSUserDefaults
Когда я впервые реализовывал долгосрочное (после закрытия приложения) хранилище данных, все, что я читал в Интернете, указывало на NSUserDefaults. Тем не менее, я хотел сохранить словарь и, хотя это было возможно, это было больно. Я часами пытался заставить ошибки типа исчезнуть.
NSUserDefaults также ограничен в функции
Дальнейшее чтение показало, как чтение / запись NSUserDefaults действительно заставляет приложение читать / записывать все или ничего, все сразу, так что это не эффективно. Затем я узнал, что получение массива не так просто. Я понял, что если вы храните больше нескольких строк или логических значений, NSUserDefaults на самом деле не идеален.
Это также не масштабируется. Если вы учитесь кодировать, изучите масштабируемый способ. Используйте NSUserDefaults только для хранения простых строк или логических значений, связанных с настройками. Хранить массивы и другие данные с помощью Core Data, это не так сложно, как говорят. Просто начните с малого.
Обновление: также, если вы добавите поддержку Apple Watch, есть еще один потенциальный фактор. NSUserDefaults вашего приложения теперь автоматически отправляется на расширение Watch.
Использование основных данных
Поэтому я проигнорировал предупреждения о том, что Core Data является более сложным решением, и начал читать. Через три часа у меня все заработало. У меня был массив таблиц, сохраненный в Core Data и перезагружающий данные при открытии приложения! Код учебника был достаточно прост в адаптации, и я смог сохранить в нем как заголовки, так и подробные массивы, лишь немного поэкспериментировав.
Поэтому для тех, кто читает этот пост, кто сталкивается с проблемами типа NSUserDefault или нуждается в чем-то большем, чем хранение строк, рассмотрите возможность потратить час или два, играя с основными данными.
Вот учебник, который я прочитал:
http://www.raywenderlich.com/85578/first-core-data-app-using-swift
Если вы не отметили «Основные данные»
Если вы не отметили «Основные данные» при создании приложения, вы можете добавить его позже, и это займет всего пять минут:
http://craig24.com/2014/12/how-to-add-core-data-to-an-existing-swift-project-in-xcode/
http://blog.zeityer.com/post/119012600864/adding-core-data-to-an-existing-swift-project
Как удалить из основных списков данных
Удалить данные из Coredata Swift
источник
Хорошо, благодаря @bploat и ссылке на http://www.codingexplorer.com/nsuserdefaults-a-swift-introduction/
Я обнаружил, что ответ довольно прост для некоторого базового хранения строк.
Я суммировал это здесь http://ridewing.se/blog/save-local-data-in-swift/
источник
Использование NSCoding и NSKeyedArchiver - еще один отличный вариант для данных, которые слишком сложны
NSUserDefaults
, но для которых CoreData будет излишним. Это также дает вам возможность более четко управлять структурой файлов, что прекрасно, если вы хотите использовать шифрование.источник
Для Swift 4.0 это стало проще:
источник
Swift 3.0
Сеттер: Локальное хранилище
Получатель: Локальное хранилище
источник
Для Swift 3
источник
Для тех, кто по каким-либо причинам не предпочел бы обрабатывать UserDefaults, есть другой вариант - NSKeyedArchiver & NSKeyedUnarchiver. Это помогает сохранять объекты в файл с помощью архиватора и загружать архивированный файл в исходные объекты.
Я написал простую утилиту для сохранения / загрузки объектов в локальном хранилище, использовали примеры кода выше. Возможно, вы захотите увидеть это. https://github.com/DragonCherry/LocalStorage
источник
Свифт 5+
Ни один из ответов на самом деле подробно не описывает встроенные возможности локального хранилища по умолчанию. Это может сделать гораздо больше, чем просто строки.
У вас есть следующие опции прямо из документации Apple для «получения» данных по умолчанию.
Вот варианты «настройки»
Если вы храните такие вещи, как настройки, а не большой набор данных, это идеальный вариант.
Двойной пример :
Установка:
Получение:
Что интересно в одном из методов получения, так это словарь dictionaryRepresentation , этот удобный метод получения возьмет все ваши типы данных независимо от того, какие они есть, и поместит их в хороший словарь, к которому вы можете получить доступ по его имени строки, и даст правильный соответствующий тип данных, когда вы запрашиваете это назад, так как это типа «любой» .
Вы можете хранить свои собственные классы и объекты, также используя
func set(Any?, forKey: String)
иfunc object(forKey: String) -> Any?
setter и getter соответственно.Надеюсь, что это проясняет возможности класса UserDefaults для хранения локальных данных.
На заметку о том, сколько вы должны хранить и как часто, Hardy_Germany дал хороший ответ на этот вопрос в этом посте , вот цитата из него
Еще одно замечание, упомянутое пользователем Мохаммадом Реза Фарахани из этого поста, - это асинхронный и синхронный характер userDefaults.
Например, если вы сохраняете и быстро закрываете программу, вы можете заметить, что она не сохраняет результаты, это потому, что она сохраняется асинхронно. Вы можете не замечать этого все время, поэтому, если вы планируете сохранить перед выходом из программы, вы можете отнести это к учету, предоставив ему некоторое время для завершения.
Может быть, у кого-то есть хорошие решения для этого, которыми они могут поделиться в комментариях?
источник
NsUserDefaults сохраняет только небольшие переменные размеры. Если вы хотите сохранить много объектов, вы можете использовать CoreData как собственное решение, или я создал библиотеку, которая поможет вам сохранять объекты так же просто, как функция .save (). Он основан на SQLite.
SundeedQLite
Проверьте это и скажите мне свои комментарии
источник