Concurrencia en iOS. Uso de GCD. I Swift
La concurrencia se da siempre que nuestra aplicación ejecuta más de una tarea de forma simultánea e independientemente al mismo tiempo. Estas tareas se agregan a las colas o ‘queues’ por lo que es importante conocer los tipos de colas que existen y adaptarlas a cada proceso para un mejor rendimiento.
Las colas siguen un sistema FIFO ‘First In First Out’. En el caso de las serializadas ejecutan las tareas individualmente lo que ofrece un mayor control de ejecución. En cambio las colas concurrentes, nos permiten ejecutar varias tareas en paralelo ofreciendo mayor rendimiento pero menor control en la finalización de los procesos. Cabe destacar que las tareas síncronas bloquean el hilo durante su ejecución, y las tareas asíncronas se ejecutan en un hilo en segundo plano, manteniendo libre el hilo principal.
Es importante que los cambios sobre la interfaz se ejecuten sobre el hilo principal, y las tareas de mayor duración se ejecuten asíncronamente en un hilo secundario para que no se bloquee nuestra aplicación.
Gracias a la librería CGD veremos como hacerlo.
En el primer caso se define una cola principal. Esta es la de mayor prioridad y será la encargada de manejar los cambios sobre la interfaz. El segundo caso declara una cola concurrente para tareas en segundo plano.
Se pueden establecer varios niveles de prioridades para la cola concurrente, por orden de mayor prioridad (userInteractive, userInitiated, utility, y background). Si no se define ninguno se establece default por defecto.
En el siguiente ejemplo se usa la cola concurrente para obtener los datos a partir de una url de manera asíncrona mediante async y en segundo plano para que no se bloquee nuestra app. Una vez que se reciben los datos, se crea una imagen a partir de estos y usamos la cola principal para actualizar la interfaz, donde se asigna la imagen resultante a el elemento.