2012-02-08 22 views
18

Estoy leyendo los documentos en las colas de distribución para GCD, y en ella dicen que las colas son FIFO, entonces ¿qué efecto tiene esto en los envíos asincrónicos/sincronizados?Grand Central Dispatch async vs sync

de mi entender asíncrono ejecuta las cosas en el orden en que se pone cosas mientras ejecuta sincronización de serie cosas ..

pero cuando se escribe el código GCD a decidir el orden en que suceden las cosas .. por lo que el tiempo que su Saber qué está pasando en su código, usted debe saber el orden en que se ejecutan las cosas.

mis preguntas son, ¿dónde está el beneficio de la asincria aquí? Me estoy perdiendo algo en mi comprensión de estas dos cosas.

Respuesta

12

sync significa que la función BLOQUEARÁ el hilo actual hasta que se complete, async significa que se manejará en segundo plano y la función NO BLOQUEARá el hilo actual.

Si quieren ejecución en serie de bloques echa un vistazo a la creación de una cola de distribución en serie

+0

ah sí que lo aclara fresco gracias por eso. Sí, estoy usando colas en serie ahora ... Simplemente no estaba seguro de dónde estaba el beneficio ahora. Gracias. –

24

La primera respuesta no es del todo completa, por desgracia. Sí, la sincronización se bloqueará y la sincronización no, sin embargo, hay semántica adicional para tener en cuenta. Llamar a dispatch_sync() también hará que su código espere hasta que todos y cada uno de los ítems pendientes en esa cola hayan terminado de ejecutarse, convirtiéndolo también en un punto de sincronización para dicho trabajo. dispatch_async() simplemente enviará el trabajo a la cola y lo devolverá inmediatamente, después de lo cual se ejecutará "en algún momento" y usted necesitará realizar un seguimiento de la finalización de ese trabajo de otra manera (generalmente anidando un dispatch_async dentro de otro dispatch_async - ver la página man, por ejemplo).

+0

gracias por su respuesta. ahora tiene mucho más sentido. –

6

Desde la página del manual:

FUNDAMENTOS

Conceptually, dispatch_sync() is a convenient wrapper around 
dispatch_async() with the addition of a semaphore to wait for completion 
of the block, and a wrapper around the block to signal its completion. 
See dispatch_semaphore_create(3) for more information about dispatch sem- 
aphores. The actual implementation of the dispatch_sync() function may be 
optimized and differ from the above description. 
1

tareas se pueden realizar sincrónica o asincrónica.

La función síncrona devuelve el control en la cola actual solo después de finalizar la tarea. Bloquea la cola y espera hasta que la tarea finalice.

Asincrónico función devuelve el control en la cola actual justo después de que la tarea se haya enviado para realizarse en la cola diferente. No espera hasta que la tarea haya terminado. No bloquea la cola.

Sólo asíncrono podemos añadir retardo ->asyncAfter(deadline: 10..

Cuestiones relacionadas