¿Cuál es la diferencia entre queues globales y queues de usuarios?

Posible duplicado:
¿Cuál es la diferencia entre dispatch_get_global_queue y dispatch_queue_create?

Veo algunos methods con gcd, pero algunos de ellos pueden hacerlo así:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); dispatch_async(queue, ^{ dispatch_sync(dispatch_get_main_queue(), ^{ }); }); 

pero otros pueden hacerlo así:

 imageQueue_ = dispatch_queue_create("com.company.app.imageQueue", NULL); dispatch_async(imageQueue_, ^{ dispatch_async(dispatch_get_main_queue(), ^{ }); }); 

¿Cuáles son las diferencias? Si quiero download muchas imágenes de la web, ¿cuál es mejor?

La mejor manera de conceptualizar las queues es primero darse count de que en el nivel muy bajo, solo hay dos types de queues: serie y concurrente.

Las queues en serie son monógamas, pero no comprometidas. Si das varias tareas a cada queue de serie, las ejecutará una a la vez, utilizando solo un hilo a la vez. El aspecto no comprometido es que las queues de serie pueden cambiar a un hilo diferente entre las tareas. Las queues de serie siempre esperan que una tarea termine antes de pasar a la siguiente. Por lo tanto, las tareas se completan en order FIFO. Puede hacer tantas queues en serie como necesite.

La queue principal es una queue serie especial. A diferencia de otras queues en serie, que no están comprometidas, ya que están "saliendo" de muchos hilos, pero solo uno a la vez, la queue principal está "casada" con el hilo principal y todas las tareas se realizan en él. La queue principal se comporta muy bien con el runloop del hilo principal para que las operaciones pequeñas no bloqueen la interfaz de usuario y otros bits importantes. Al igual que todas las queues en serie, las tareas se completan en order FIFO.

Si las queues en serie son monógamas, las queues simultáneas son promiscuas. Enviarán tareas a cualquier subprocess disponible o incluso crearán nuevos subprocesss dependiendo de la carga del sistema. Pueden realizar múltiples tareas simultáneamente en diferentes subprocesss. Es importante que las tareas enviadas a la queue global sean seguras para subprocesss y minimicen los efectos secundarios. Las tareas se envían para su ejecución en order FIFO, pero no se garantiza el order de finalización.

Devolviéndolo, todas las queues globales son concurrentes y todas las queues de usuario son seriales .

Si su objective es download imágenes, probablemente desee una queue serie (usuario). La descarga de imágenes es más una cosa de ancho de banda. Por lo general, solo quiere hacer uno (o algunos) a la vez.

editar: la publicación del blog se expandió en la respuesta anterior: http://amattn.com/2013/08/28/grand_central_dispatch_gcd_summary_syntax_best_practices.html

Si usa dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); GCD creará automáticamente suficientes hilos para que procese el trabajo y, si es posible, utilice varios núcleos.

Por otro lado, si usa imageQueue_ = dispatch_queue_create("com.company.app.imageQueue", NULL); obtienes una queue en serie y un comportamiento de primer en primer lugar.

Si no le preocupa la security de los hilos o el order en que regresan sus trabajos, use el primer método.