2010-07-31 10 views
11

que tienen una tarea asíncrona de este modo:¿Cómo puedo recibir una notificación cuando se completa una tarea dispatch_async?

dispatch_async(dispatch_get_main_queue(), ^{ 
    myAsyncMethodsHere; 
}); 

¿Hay una manera de ser notificado cuando la tarea de fondo es completa?

¿O para llamar a un método al finalizar?

He leído la documentación y he examinado dispatch_after, pero parece estar más diseñado para enviar el método después de un cierto período de tiempo.

Gracias por la ayuda.

Respuesta

15

A partir de los documentos:

devoluciones de llamada TERMINACIÓN

devoluciones de llamada de terminación se puede lograr a través de llamadas anidadas a la dispatch_async de función(). Es importante recordar mantener la cola de destino antes de la primera llamada a dispatch_async(), y liberar esa cola al final de la devolución de llamada de finalización para asegurar que la cola de destino no se desasigna mientras la devolución de llamada de finalización está pendiente. Por ejemplo:

void 
async_read(object_t obj, 
     void *where, size_t bytes, 
     dispatch_queue_t destination_queue, 
     void (^reply_block)(ssize_t r, int err)) 
{ 
     // There are better ways of doing async I/O. 
     // This is just an example of nested blocks. 

     dispatch_retain(destination_queue); 

     dispatch_async(obj->queue, ^{ 
       ssize_t r = read(obj->fd, where, bytes); 
       int err = errno; 

       dispatch_async(destination_queue, ^{ 
         reply_block(r, err); 
       }); 
       dispatch_release(destination_queue); 
     }); 
} 

Source

+0

hi .. tengo una duda .. de acuerdo con las documentaciones: dispatch_async vuelve inmediatamente, y luego el bloque se ejecuta de forma asincrónica en el fondo. Mi duda es ... ya que estamos utilizando dispatch_release después de la llamada de inner dispatch_async, ¿no va a lanzar la destination_queue antes de ejecutar el bloque interno sobre ella? – Devarshi

+0

posiblemente, puede ser mejor incluir la liberación en el interior de la devolución de llamada dispatch_async así: dispatch_async (destination_queue,^{ reply_block (r, err); dispatch_release (destination_queue);}); – ACBurk

+0

Creo que la cola se conservará en la creación del bloque, no cuando se ejecuta. –

Cuestiones relacionadas