domingo, 15 de marzo de 2015

Asset Catalogs

La existencia de dispositivos iOS con diferente resolución, hace que sea necesario gestionar la resolución de las imágenes utilizadas en las Apps según el dispositivo en el que se lance para evitar que salgan pixeladas. Anteriormente se utilizaban diferentes nombres, como file@2x.png, file-568h@2x.png, etc. para una misma imagen.

Asset Catalogs nos permite simplificar la gestión de las imágenes que utiliza nuestra aplicación. Ya no es necesario utilizar diferentes nombres o comprobar mediante código en que dispositivo se está ejecutando la aplicación.

Para añadir nuevos elementos al Asset Catalog, se selecciona el xcassets y, pulsando con el botón derecho del ratón en la ventana donde aparece la lista de conjuntos de imágenes, aparecerá un menú emergente mediante el que podemos añadir un nuevo conjunto de imágenes, el icono de la aplicación, la imagen que aparece al lanzar la aplicación o un icono OS X.

Fig. 1



En la siguiente imagen se ha creado un conjunto de imágenes  llamado Clock. Al haber seleccionado en el Attributes Inspector que el tipo de dispositivo es Universal, nos permite añadir imágenes con resolución 1x, 2x y 3x.

Fig. 2

Para hacer referencia a este conjunto de imágenes, basta con utilizar su nombre, en este caso Clock, sin necesidad de extensión. El nombre de los archivos que contienen las imágenes puede ser cualquiera, no hace falta que tenga ningún tipo de sufijo del tipo @2x o @3x.

En el caso de que sea necesaria una determinada imagen según el tipo de dispositivo, es necesario seleccionar la opción Device Specific y marcar los checks de los dispositivos para los que se crea el conjunto de imágenes, tal y como se muestra en la siguiente figura.

Fig. 3

@Fin

sábado, 14 de marzo de 2015

Conceptos de Core Data

Vamos a ver algunos de los conceptos más importantes relacionados con Core Data.

 Lo primero, ¿que es Core Data? Core Data es un framework que permite trabajar con tus datos como si fueran objetos, independientemente de cómo están almacenados en disco. Se situa entre tu aplicación y un persistent store, que es el término genérico para un fichero de datos, el cual puede ser una base de datos SQLite, un fichero XML o un almacen binario. A estos ficheros se les llama persistent por que permanecen a pesar de que cierres la aplicación, reinicies el dispositivo, etc.

Core Data utiliza un Managed Object Model para configurar los datos de tu aplicación utilizando un object graph. Cada objeto del object graph se llaman entity. Una vez que tienes definidos managed objects, se puede manipular nativamente en Objective-C sin necesidad de utilizar SQL (o cualquier otro tipo de tratamiento de un persistent store).

En la siguiente imagen vemos un object graph muy simple con dos entidades Client y Purchase. Como veis, es similar a un esquema de base de datos, en donde las entities serían las tablas.

Fig. 1


Un managed object contiene una copia de datos de un persistent store. Si tu persistent store es una base de datos, un managed objet representaría una fila de una tabla de la base de datos. Un managed object es una instancia de NSManagedObject, aunque usualmente es una instancia de una subclase de NSManagedObject.

Todos los managed objects existen en un managed object context, que existe en memoria RAM. De esta manera se accede a los datos que han sido previamente leidos de disco de una manera muy rápida sin necesidad de estar continuamente accediendo a disco. El managed object necesitará llamar a save: para escribir los cambios en disco.

En la imagen Fig.2 se ilustra como encajan las piezas principales de Core Data:

Fig. 2

En Fig.2, el Persistent Store Coordinator se muestra conteniendo un persistent store con filas de una tabla. Cuando se configura un persistent store coordinator, normalmente se elige una base de datos SQLite como persistent store. Un persistent store coordinator puede tener varios persistent store. Por ejemplo, cuando Core Data se integra con iCloud, poniendo datos que no pertenecen a iCloud en un persistent store y los que si pertenecen en otro, se optimiza el ancho de banda y el espacio de almacenamiento usado en iCloud. Se utilizan instancias de NSPersistentStore y NSPersistentStoreCoordinator para crear persistent stores y persistent store coordinators respectivamente.

En el medio de Fig.2 se representa en el medio el Managed Object Model. Es la representación gráfica de la estructura de datos. Las entities no contienen datos, solo definen las propiedades que tienen los managed objects basados en ellas. Un managed object model se crea mediante una instancia de NSManagedObjectModel.

Finalmente, en la derecha de la Fig. 2 se muestra el managed object context que se encarga de gestionar el ciclo de vida de los managed objects incluidos en él y proporciona características para hacer fetch de los datos, validaciones y seguimiento de los cambios. También se pueden definir varios managed object context, lo cual se utiliza sobre todo para realizar procesamiento en background, como salvar o importar datos. Para crearlo se instancia NSManagedObjectContext.

@Fin