2010-07-31 9 views
11

J'ai une tâche asynchrone comme ceci:Comment puis-je être averti lorsqu'une tâche dispatch_async est terminée?

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

est-il un moyen d'être informé de la tâche de fond est terminée?

Ou d'appeler une méthode à la fin?

J'ai lu la documentation et j'ai regardé dans dispatch_after, mais il semble être plus conçu pour expédier la méthode après un certain laps de temps.

Merci pour l'aide.

Répondre

15

De la documentation:

ACHÈVEMENT CALLBACKS

callbacks d'achèvement peut être accompli par des appels imbriqués à la fonction dispatch_async(). Il est important de ne pas oublier de conserver la file d'attente avant le premier appel à dispatch_async() et de libérer cette file à la fin du rappel pour s'assurer que la file d'attente n'est pas libérée tant que le rappel est en attente. Par exemple:

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

salut .. J'ai un doute .. selon les dispatch_async: retourne documentation immédiatement, puis le bloc exécute de manière asynchrone en arrière-plan. Mon doute est .. puisque nous utilisons dispatch_release après l'appel de dispatch_async interne, ne va-t-il pas libérer la destination_queue avant d'y exécuter le bloc interne? – Devarshi

+0

peut-être, il peut être préférable d'inclure la libération intérieur du rappel dispatch_async comme ceci: dispatch_async (destination_queue,^{ reply_block (r, err); dispatch_release (destination_queue);}); – ACBurk

+0

Je crois que la file d'attente sera conservée à la création du bloc, pas quand il est exécuté. –

Questions connexes