2010-07-31 5 views
11

Ich habe eine asynchrone Aufgabe wie folgt:Wie kann ich benachrichtigt werden, wenn eine dispatch_async-Aufgabe abgeschlossen ist?

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

Gibt es eine Möglichkeit benachrichtigt werden, wenn die Hintergrundaufgabe abgeschlossen ist?

Oder eine Methode nach Abschluss aufrufen?

Ich habe die Dokumentation durchgelesen und habe in dispatch_after nachgeschaut, aber es scheint eher so zu sein, dass die Methode nach einer gewissen Zeit versendet werden kann.

Danke für die Hilfe.

Antwort

15

Aus der Dokumentation:

ABSCHLUSS BESUCHE

Completion Rückrufe können über verschachtelte Aufrufe an die dispatch_async() Funktion erreicht werden. Es ist wichtig, sich daran zu erinnern, die Zielwarteschlange vor dem ersten Aufruf von dispatch_async() beizubehalten und diese Warteschlange am Ende des Abschlussrückrufs freizugeben, um sicherzustellen, dass die Zielwarteschlange nicht freigegeben wird, während der Abschlussrückruf aussteht. Zum Beispiel:

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

.. Hallo Ich habe einen Zweifel .. entsprechend den Dokumentationen: dispatch_async sofort zurückkehrt, und führt dann der Block asynchron im Hintergrund. Mein Zweifel ist .. da wir dispatch_release nach dem Aufruf von inner dispatch_async verwenden, wird es nicht die Zielwarteschlange freigeben, bevor der innere Block darauf ausgeführt wird? – Devarshi

+0

möglicherweise kann es besser sein, die Freisetzung Innenseite des dispatch_async Rückruf umfassen, so wie: dispatch_async (destination_queue,^{ reply_block (r, err); dispatch_release (destination_queue);}); – ACBurk

+0

Ich glaube, dass die Warteschlange bei der Erstellung des Blocks beibehalten wird, nicht, wenn es ausgeführt wird. –

Verwandte Themen