Ultimamente sólo hablamos de Swift, y tenemos muy abandonado a Objective-C y sobre todo a Cocoa-Touch.
En esta entrada vamos a conocer un poco más la API Grand Central Dispatch, un Framework que nos va a permitir trabajar en un entorno multitarea.
La programación concurrente es uno de los “dolores de cabeza” más frecuente de todo desarrollador.
Consiste en ejecutar en varios hilos las distintas tareas que realizará nuestra aplicación.
¿Por que íbamos a querer ejecutar tareas en distintos hilos?
Pues por que muchas veces hay procesos que pueden dejar “congelada” la interfaz de usuario.
Por ejemplo queremos descargar datos de internet, esto no debe afectar a la interfaz de usuario, por ello la descarga la realizaremos en un hilo distinto del principal.
Los núcleos del procesador y el sistema operativo son los encargados de ejecutar varios procesos en distintos hilos o threads.
Un hilo es un subproceso que se ejecuta de forma simultánea con otros subprocesos.
El main-thread o hilo principal es el hilo dónde generalmente se van a ejecutar las tareas de nuestra App.
GCD es una API de Apple escrita en C para ejecutar código concurrente en OS X e iOS.
Apple liberó el proyecto haciéndolo Open Source, bajo una librería llamada:
libdispatch.
Grand Central Dispatch es el nombre “marketininiano” de Apple de esta API.
Grand Central Dispatch
El espíritu de GCD es liberar al desarrollador de la responsabilidad de manejar los hilos dentro de un proceso concurrente, en su lugar, gestionaremos colas.
Usaremos bloques para ejecutar tareas concurrentes con Grand Central Dispatch.
¡Cuidado con UIKit!
Cuándo usamos GCD tenemos que tener en cuenta una cosa, UIKIT no es seguro en un entorno multitarea, por lo que nunca deberemos ejecutar tareas de vista en segundo plano, siempre haremos estas ejecuciones en el hilo principal.
Para que una o varias operaciones se ejecuten fuera del hilo principal, asignaremos dichas operaciones a una cola o queue.
Colas
Podemos crear 2 tipos de colas:
-En Serie: las tareas se ejecutan una detrás de otra.
dispatch_queue_create
-Concurrentes: las tareas se ejecutan de forma simultanea.
dispatch_get_global_queue
Disponemos de 3 colas globales o concurrentes para dar prioridad a nuestras tareas:
DISPATCH_QUEUE_PRIORITY_HIGH
DISPATCH_QUEUE_PRIORITY_LOW
DISPATCH_QUEUE_PRIORITY_DEFAULT
La cola que maneja el hilo principal es:
MAIN_QUEUE
Cómo veis Grand Central Dispatch nos hace las cosas muy fáciles a la hora de manejar colas para trabajar en entornos multiproceso.
Otra opción para trabajar con colas, es decir trabajar con varios procesos en distitos hilos de ejecución, es usar las clases NSOperation y NSOperationQueue, estas clases de un nivel de abstracción superior, simplifican al igual que hace Grand Central Dispatch, la tarea de tratar con varios subprocesos.
Pero estas clases las trataremos en una próxima entrada.