2012-02-27 18 views
8

¿Por qué alguien usaría alguna vez dispatch_sync si el bloque tiene que esperar hasta que termine el hilo principal? ¿Cuál es el beneficio de usar esta función en lugar de escribir código en línea (sin bloque y fuera de Grand Central Dispatch). Es posible que esté malinterpretando lo que realmente hace dispatch_sync. Gracias.¿Cuál es la ventaja de usar dispatch_sync si tiene que esperar hasta que se complete el hilo principal?

+1

posible duplicar: http://stackoverflow.com/questions/4607125/usage-of-dispatch-sync-in-grand-central-dispatch – UIAdam

Respuesta

7

dispatch_sync hace lo que usted piensa - publica el bloque en la cola nominada y bloquea la cola actual hasta que se haya realizado el bloqueo. La cola/hilo principal no está específicamente involucrado a menos que esté despachando hacia él o desde él.

Por lo tanto, generalmente lo usaría si tuviera que realizar una operación en una cola/subproceso diferente, como una operación SQLite u OpenGL, pero necesitaba el resultado de la operación o simplemente necesitaba saber que el la operación se completó por términos de funcionalidad.

El patrón:

dispatch_async(otherQueue, 
    ^{ 
      id result = doHardTask(); 

      dispatch_async(originalQueue, 
       ^{ 
        didGetResult(result); 
       }); 
    }); 

es mejor práctica, pero no es realmente algo que sólo puede pegar en al final.

+0

Ah, entonces cuando nominas una cola, esta es realmente una cola secundaria (es decir, no es la cola principal de mi aplicación y no causaría un bloqueo). Por lo tanto, si uso todos los bloques dispatch_sync, sigo teniendo la ventaja de ejecutar un hilo secundario. ¿Ese derecho? – Ryan

+1

dispatch_sync agrega efectivamente el costo de tiempo del bloque a dos colas en lugar de una (aunque el procesamiento se realiza solo una vez). Por lo tanto, no obtendrá ningún beneficio inherente de interacción del usuario al usar 'dispatch_sync' en su hilo principal. – Tommy

0

Puede usar dispatch_async para iniciar una cola simultánea y dentro del bloque asociado con esa llamada puede usar dispatch_sync para iniciar una serie de tareas en una segunda cola. Todo esto ocurriría sin bloquear la cola principal.

+0

¿Hay algún punto para utilizar un dispatch_sync si estoy usando todo dispatch_sync aunque ? Estoy mirando el código de alguien y eso es todo lo que usan. Parece que podrías hacer lo mismo sin los bloques. ¿No? – Ryan

+0

De forma manual, no puedo pensar en una ocasión en la que usaría dispatch_sync fuera de un bloque enviado con dispatch_async, como lo ilustra el código de Tommy. –

Cuestiones relacionadas