¿Qué es Grand Central Dispatch y cuál es su propósito principal?

Grand Central Dispatch es una colección de funciones destinadas a ayudarlo a escribir código que se puede ejecutar en una secuencia específica (o al mismo tiempo). Esto es muy útil para lidiar con un entorno de subprocesos múltiples donde no siempre se garantiza que se pueda acceder y / o ejecutar su código cuando cree que lo será. También escribir código que gestione hilos es una gran sobrecarga. IOS utiliza subprocesos múltiples para que la ejecución de código en iPhones y iPads sea muy rápida y eficiente. Proporciona GCD para que no tenga que preocuparse por todos los detalles de la gestión de los subprocesos detrás del código, pero aún así use subprocesos múltiples para que su aplicación sea rápida y receptiva.

La mayoría de las veces, no necesariamente te importa mucho exactamente cuando se ejecuta tu código; una secuencia general es suficiente. Pero hay momentos en los que realmente importa cuál es la secuencia. Imagine que escribió un código que recupera una imagen de un servidor y se la muestra al usuario. Sin una forma de ejecutar tareas de forma asincrónica, lo que significa que puede iniciar una tarea y luego iniciar otra y verificar periódicamente la primera mientras se ejecuta la segunda, ¿qué sucedería? Te verías obligado a esperar a que esa imagen termine de descargarse. (O podría verificar periódicamente los datos de imagen acumulados para ver si lo tenía todo, pero eso requeriría mucha más complejidad para saber que sus datos de imagen estaban completos).

¿Y qué pasa si su imagen es enorme, su conexión lenta o el servidor lo hace esperar por alguna razón? El usuario simplemente se sentaría allí y miraría una pelota giratoria hasta que la imagen terminara de descargarse. No muy divertido

Entonces, lo que hace GCD es proporcionar una serie de colas a las que puede enviar tareas y GCD administra los detalles de la ejecución de las tareas y qué hacer con el resultado de la tarea. Las diferentes colas ejecutan las tareas de diferentes maneras (y también puede especificar una prioridad).

Si desea enviar su tarea de descarga de imágenes y hacer que cargue la imagen en un UIImageView, por ejemplo, puede usar dispatch_async para descargar la imagen en una cola de fondo y decirle que cargue la imagen en la vista deseada cuando haya terminado. Las tareas que afectan la interfaz de usuario deben ejecutarse en la cola principal, por lo que técnicamente colocaría un segundo bloque de envío que envíe el resultado de la descarga a la cola principal (si no usó la cola principal).

Suponga que tiene 2 imágenes, pero por alguna razón tiene que cargar la imagen B solo después de descargar A. Puede usar bloques de despacho anidados para lograr eso, pero para evitar que el usuario tenga que mirar un Spinny Ball, puede buscar las imágenes de forma asincrónica en un bloque dispatch_async, y luego usar una cola de despacho en serie que cree para ejecutar los resultados en secuencia. Incluso puede hacer que todo espere un período de tiempo específico envolviéndolo todo en un bloque dispatch_after.

Realmente no obtuve GCD hasta que tuve algunos problemas con cosas inesperadas que sucedieron en mi código y me di cuenta de que no estaban sucediendo en el orden que esperaba. Puede tomar algo así antes de que realmente “obtenga” GCD. Por ahora, solo lea los documentos e intente analizar algunos ejemplos.