ios swift nsuserdefaults

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.



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.

SundeedQLite

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

Eliminar datos de Coredata Swift


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 }