tutorials tutorial example ios objective-c multithreading grand-central-dispatch

ios - tutorial - ¿Cuál es la diferencia entre dispatch_get_global_queue y dispatch_queue_create?



nsoperationqueue swift 3 example (3)

Acabo de publicar una respuesta diferente, pero aquí hay algo que escribí hace bastante tiempo:

La mejor forma de conceptualizar colas es primero darse cuenta de que en el nivel muy bajo, solo hay dos tipos de colas: seriales y concurrentes.

Las colas en serie son monógamas, pero no están comprometidas. Si le da un montón de tareas a cada cola en serie, las ejecutará una a la vez, usando solo un hilo a la vez. El aspecto no comprometido es que las colas en serie pueden cambiar a un hilo diferente entre las tareas. Las colas en serie siempre esperan a que una tarea finalice antes de pasar a la siguiente. Por lo tanto, las tareas se completan en orden FIFO. Puede hacer tantas colas en serie como necesite con dispatch_queue_create .

La cola principal es una cola serie especial. A diferencia de otras colas en serie, que no están comprometidas, dado que están "fechando" muchos hilos pero solo uno a la vez, la cola principal está "unida" al hilo principal y todas las tareas se realizan en él. Los trabajos en la cola principal deben comportarse bien con el runloop para que las operaciones pequeñas no bloqueen la IU y otros bits importantes. Al igual que todas las colas en serie, las tareas se completan en orden FIFO.

Si las colas en serie son monógamas, las colas concurrentes son promiscuas. Presentarán tareas a cualquier hilo disponible o incluso crearán nuevos hilos dependiendo de la carga del sistema. Pueden realizar múltiples tareas simultáneamente en diferentes hilos. Es importante que las tareas enviadas a la cola global sean seguras para hilos y minimicen los efectos secundarios. Las tareas se envían para su ejecución en orden FIFO, pero el orden de finalización no está garantizado. Al momento de escribir esto, solo hay tres colas concurrentes y no puedes hacerlas, solo puedes buscarlas con dispatch_get_global_queue .

edit: blog expandiendo en esta respuesta: http://amattn.com/p/grand_central_dispatch_gcd_summary_syntax_best_practices.html

Estoy escribiendo un programa iOS moderadamente complejo que necesita tener múltiples hilos para algunas de sus operaciones más largas (análisis, conexiones a la red ... etc.). Sin embargo, estoy confundido sobre cuál es la diferencia entre dispatch_get_global_queue y dispatch_queue_create .

¿Cuál debería usar y podría darme una explicación simple de cuál es la diferencia en general? Gracias.


Tal como lo describe la documentation , una cola global es buena para tareas simultáneas (es decir, va a despachar varias tareas de forma asincrónica y está completamente satisfecho si se ejecutan simultáneamente) y si no desea encontrar la carga teórica de crear y destruyendo tu propia cola

La creación de su propia cola es muy útil si necesita una cola en serie (es decir, necesita que los bloques enviados se ejecuten uno a la vez). Esto puede ser útil en muchos escenarios, como cuando cada tarea depende de la anterior o cuando se coordina la interacción con algún recurso compartido de múltiples hilos.

Menos común, pero también querrás crear tu propia cola si necesitas usar barriers junto con una cola simultánea. En ese escenario, cree una cola simultánea (es decir, dispatch_queue_create con la opción DISPATCH_QUEUE_CONCURRENT ) y use las barreras junto con esa cola. Nunca debe usar barreras en colas globales.

Mi asesor general es si necesita una cola en serie (o necesita usar barreras), luego cree una cola. Si no lo hace, siga adelante y use la cola global y omita los gastos generales de crear la suya propia.

Si desea una cola concurrente, pero desea controlar cuántas operaciones se pueden ejecutar simultáneamente, también puede considerar el uso de NSOperationQueue que tenga una propiedad maxConcurrentOperationCount . Esto puede ser útil al hacer operaciones de red y no desea que se envíen demasiadas solicitudes concurrentes a su servidor.


Uno devuelve la cola global existente, el otro crea uno nuevo. En lugar de usar GCD, consideraría usar NSOperation y la cola de operaciones. Puede encontrar más información al respecto en esta guía. Por lo general, si desea que las operaciones se ejecuten al mismo tiempo, desea crear su propia cola y colocar sus operaciones en ella.