iOS 7 – NSUserDefault

En iOS cada aplicación tiene un sistema de almacenamiento por defecto para cada usuario llamado User Default System (UDS), el cual está compuesto por una base de datos en la que, a través de unos parámetros y métodos, podemos almacenar y recuperar ciertos valores, que suelen ser pequeñas cantidades de datos que usamos comúnmente en nuestra aplicación. Estos datos suelen ser el usuario o las preferencias del propio usuario, como por ejemplo, la configuración de pantalla, el intervalo de tiempo con el que quiere que se guarden los datos o que se descarguen del servidor, registro de fechas en las que se ejecutaron algunas acciones, etcétera.

¿Qué vamos a ver en este post? Primero lo sencillo que es guardar variables básicas. A continuación veremos cómo guardar algo más complicado, como un objeto. 

Algunas características de esta clase

Creo que es muy interesante comenzar explicando las características más relevantes de esta clase. Iba a escribirlo con mis propias palabras, pero encontré esta definición que realmente lo explica mejor de lo que yo lo hubiera hecho.

“Solo existe una única instancia de esta clase por aplicación.

Una ventaja es el almacenamiento en caché de la información. Un sistema como éste implicaría abrir la base de datos constantemente, en concreto cada vez que el usuario pida información. Para evitar esta constante apertura, la clase almacena los datos en caché. El método synchronize es invocado periódicamente y se encarga de escribir los datos nuevos en caché y de actualizar los ya existentes, y esto lo hace de forma transparente al usuario. No obstante si no deseas esperar a la sincronización automática, puedes usar este método para actualizar los datos inmediatamente, teniendo cuidado de llamarlo sólo cuando hayas hecho alguna modificación. Así nos evitamos una sobrecarga de conexiones con la base de datos.

Otro punto importante a tener en cuenta es que todos los valores retornados desde la base de datos son inmutables (es decir, que no se pueden modificar), incluso aunque guardaras un valor mutable (por ejemplo una instancia de NSMutableString), al retornarlo al usuario sería inmutable.” Vía Luis Cárdenas thxou.

Con NSUserDefaults podemos guardar los siguientes tipos de objetos:

  • NSData
  • NSString
  • NSNumber
  • NSDate
  • NSArray
  • NSDictionary

Si queremos almacenar cualquier otro tipo de objeto, como un UIImage , normalmente necesitamos envolverlo en una instancia de NSData, NSNumber o NSString. Tampoco podemos guardar enteros.

 Guardando variables sencillas

Os lo voy a explicar muy rápido. Es tan simple que no hace falta ni crear un proyecto.

Para guardar, simplemente es guardar una pareja clave-valor.

Para recuperar, es asignarle a una variable el valor que tenía almacenado la clave por la que preguntamos.

Listo!!!

Guardando un objeto

Vamos a guardar un objeto de tipo User, que simplemente tendrá un ID, un nombre y una contraseña. De momento, en el ID hemos puesto siempre 1. Si quisiéramos que el número fuera incrementando, tendríamos varias posibilidades. El proceso es el siguiente:

  1. Creamos una aplicación vacía
  2. Creamos un modelos User
    1. Añadimos métodos para guardar y cargar los valores que deseemos almacenar en el NSUserDefault
  3. Creamos un UIViewController al que llamaremos RootViewController con el .xib
  4. Añadimos elementos a la vista
  5. Creamos las acciones de los botones
  6. Bonus: Toques en la pantalla para ocultar el teclado y acción Return

 

1. Creamos una aplicación vacía

NSUserDefault7

2. Creamos un modelos User

Captura de pantalla 2014-03-26 a la(s) 14.00.47 Captura de pantalla 2014-03-26 a la(s) 14.01.06

 Añadimos métodos para guardar y cargar los valores que deseemos almacenar en el NSUserDefault.

3. Creamos un UIViewController al que llamaremos RootViewController con el .xib

NSUserDefault1

 

4. Añadimos elementos a la vista

Son dos labels y dos textField, dos botones y un textView.

nsuserdefault1

Una vez hecho esto, tenemos que vincular los elementos de nuestra vista en nuestro fichero RootViewController.h así como las acciones de los botones en nuestro RootViewController.m

NSUserDefault7

NSUserDefault8

 

5. Creamos las acciones de los botones

Lo primero será añadir a nuestro fichero RootViewController.m una variable de tipo User que utilizaremos.

A continuación vamos a proceder a rellenar la acción de los botones, que lo que harán será guardar/capturar el id del usuario, un alias y su contraseña. Además, tendrán presente dos cosas: el método guardar, requiere que al menos se escriba un nombre de usuario; el método capturar, nos mostrará una alerta en caso de que todavía no se haya guardado nada.

Podemos ver el resultado:

nsuserdefault2nsuserdefault3

 

6. Bonus: Toques en la pantalla para ocultar el teclado y acción Return

Hemos añadido que el teclado se oculte sólo mediante un UITapGestureRecognizer y que tenga activa la tecla return. Vamos por pasos. Para que el teclado se oculte al pulsar la tecla Return hemos hecho lo siguiente.

Ocultar teclado. En primer lugar añadir a nuestro RootViewController.h el delegado. Vamos a aprovechar también de añadir el delegado del UIGestureRecognizer.

En el RootViewController.m hemos declarado los delegados y definido los métodos que vamos a utilizar.

Ocultando el teclado al hacer click fuera. En primer lugar declaramos un TapGestureRecognizer y a continuación se lo añadimos a nuestra vista. Este TapGesture llamará al método handleTapGesture, y que lo único que hará es ocultar el teclado.

 

Deja un comentario