ios - ¿Cómo guardar datos locales en una aplicación Swift?
user defaults swift 4 (9)
Actualmente estoy trabajando en una aplicación iOS desarrollada en Swift y necesito almacenar contenido creado por el usuario en el dispositivo, pero parece que no puedo encontrar una manera simple y rápida de almacenar / recibir el contenido de los usuarios en el dispositivo.
¿Alguien podría explicar cómo almacenar y acceder al almacenamiento local?
La idea es almacenar los datos cuando el usuario ejecuta una acción y recibirlos cuando se inicia la aplicación.
De acuerdo, gracias a bpolat y al enlace a codingexplorer.com/nsuserdefaults-a-swift-introduction
Descubrí que la respuesta es bastante simple para un almacenamiento básico de cadenas.
let defaults = NSUserDefaults.standardUserDefaults()
// Store
defaults.setObject("theGreatestName", forKey: "username")
// Receive
if let name = defaults.stringForKey("username")
{
print(name)
// Will output "theGreatestName"
}
Lo resumí aquí http://ridewing.se/blog/save-local-data-in-swift/
La solución más simple si solo está almacenando dos cadenas es
NSUserDefaults
, en Swift 3 esta clase se ha cambiado a solo
UserDefaults
.
Es mejor almacenar sus claves en algún lugar del mundo para poder reutilizarlas en otro lugar de su código.
struct defaultsKeys {
static let keyOne = "firstStringKey"
static let keyTwo = "secondStringKey"
}
Swift 3.0, 4.0 y 5.0
// Setting
let defaults = UserDefaults.standard
defaults.set("Some String Value", forKey: defaultsKeys.keyOne)
defaults.set("Another String Value", forKey: defaultsKeys.keyTwo)
// Getting
let defaults = UserDefaults.standard
if let stringOne = defaults.string(forKey: defaultsKeys.keyOne) {
print(stringOne) // Some String Value
}
if let stringTwo = defaults.string(forKey: defaultsKeys.keyTwo) {
print(stringTwo) // Another String Value
}
Swift 2.0
// Setting
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject("Some String Value", forKey: defaultsKeys.keyOne)
defaults.setObject("Another String Value", forKey: defaultsKeys.keyTwo)
// Getting
let defaults = NSUserDefaults.standardUserDefaults()
if let stringOne = defaults.stringForKey(defaultsKeys.keyOne) {
print(stringOne) // Some String Value
}
if let stringTwo = defaults.stringForKey(defaultsKeys.keyTwo) {
print(stringTwo) // Another String Value
}
Para cualquier cosa más grave que una configuración menor, banderas o cadenas de base, debe usar algún tipo de almacén persistente: una opción popular en este momento es Realm pero también puede usar SQLite o Apples CoreData .
NsUserDefaults guarda solo tamaños variables pequeños. Si desea guardar muchos objetos, puede usar CoreData como una solución nativa, o he creado una biblioteca que lo ayuda a guardar objetos tan fácilmente como la función .save (). Está basado en SQLite.
Compruébalo y dime tus comentarios
Para Swift 3
UserDefaults.standard.setValue(token, forKey: "user_auth_token")
print("/(UserDefaults.standard.value(forKey: "user_auth_token")!)")
Para Swift 4.0, esto se hizo más fácil:
let defaults = UserDefaults.standard
//Set
defaults.set(passwordTextField.text, forKey: "Password")
//Get
let myPassword = defaults.string(forKey: "Password")
Para alguien que no preferiría manejar UserDefaults por alguna razón, hay otra opción: NSKeyedArchiver y NSKeyedUnarchiver. Ayuda a guardar objetos en un archivo usando el archivador y cargar archivos archivados en objetos originales.
// To archive object,
let mutableData: NSMutableData = NSMutableData()
let archiver: NSKeyedArchiver = NSKeyedArchiver(forWritingWith: mutableData)
archiver.encode(object, forKey: key)
archiver.finishEncoding()
return mutableData.write(toFile: path, atomically: true)
// To unarchive objects,
if let data = try? Data(contentsOf: URL(fileURLWithPath: path)) {
let unarchiver = NSKeyedUnarchiver(forReadingWith: data)
let object = unarchiver.decodeObject(forKey: key)
}
Escribí una utilidad simple para guardar / cargar objetos en el almacenamiento local, utilicé los códigos de muestra anteriores. Es posible que desee ver esto. https://github.com/DragonCherry/LocalStorage
Usar
NSCoding y NSKeyedArchiver
es otra gran opción para datos que son demasiado complejos para
NSUserDefaults
, pero para los cuales CoreData sería excesivo.
También le brinda la oportunidad de administrar la estructura de archivos de manera más explícita, lo cual es excelente si desea utilizar el cifrado.
Dicen que use NSUserDefaults
Cuando estaba implementando el almacenamiento de datos a largo plazo (después del cierre de la aplicación) por primera vez, todo lo que leí en línea me indicó NSUserDefaults. Sin embargo, quería almacenar un diccionario y, aunque era posible, estaba resultando un dolor. Pasé horas intentando que los errores de tipo desaparecieran.
NSUserDefaults también tiene una función limitada
La lectura adicional reveló cómo la lectura / escritura de NSUserDefaults realmente obliga a la aplicación a leer / escribir todo o nada, todo a la vez, por lo que no es eficiente. Luego aprendí que recuperar una matriz no es sencillo. Me di cuenta de que si está almacenando más de unas pocas cadenas o booleanos, NSUserDefaults realmente no es ideal.
Tampoco es escalable. Si está aprendiendo a codificar, aprenda de forma escalable. Utilice solo NSUserDefaults para almacenar cadenas simples o booleanos relacionados con las preferencias. Almacene matrices y otros datos utilizando Core Data, no es tan difícil como dicen. Solo comienza pequeño.
Actualización: Además, si agrega soporte para Apple Watch, hay otra consideración potencial. El NSUserDefaults de su aplicación ahora se envía automáticamente a Watch Extension.
Usando datos básicos
Así que ignoré las advertencias sobre Core Data como una solución más difícil y comencé a leer. En tres horas lo tuve funcionando. ¡Tenía mi matriz de tablas guardada en Core Data y volví a cargar los datos al abrir la aplicación nuevamente! El código del tutorial fue bastante fácil de adaptar y pude hacer que almacenara matrices de títulos y detalles con solo un poco de experimentación adicional.
Entonces, para cualquiera que lea esta publicación que tenga problemas con los problemas de tipo NSUserDefault o cuya necesidad sea más que almacenar cadenas, considere pasar una o dos horas jugando con los datos principales.
Aquí está el tutorial que leí:
http://www.raywenderlich.com/85578/first-core-data-app-using-swift
Si no marcó "Datos principales"
Si no marcó "Datos principales" cuando creó su aplicación, puede agregarla después y solo le llevará cinco minutos:
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
Cómo eliminar de las listas de datos principales
Swift 3.0
Setter: almacenamiento local
let authtoken = "12345"
// Userdefaults helps to store session data locally
let defaults = UserDefaults.standard
defaults.set(authtoken, forKey: "authtoken")
defaults.synchronize()
Getter: almacenamiento local
if UserDefaults.standard.string(forKey: "authtoken") != nil {
//perform your task on success }