2010-07-31 11 views
11

Ho un compito asincrona in questo modo:Come posso essere avvisato quando un'attività di dispatch_async è completa?

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

Esiste un modo per essere avvisati quando il compito di fondo è completa?

Oppure chiamare un metodo al completamento?

Ho letto la documentazione e ho cercato in dispatch_after, ma sembra essere più progettato per inviare il metodo dopo un certo periodo di tempo.

Grazie per l'aiuto.

risposta

15

Dalla documentazione:

callback COMPLETAMENTO

callback di completamento può essere realizzato tramite chiamate nidificate al dispatch_async funzione(). È importante ricordare di conservare la coda di destinazione prima della prima chiamata a dispatch_async() e di rilasciare tale coda al termine del callback di completamento per garantire che la coda di destinazione non sia deallocata mentre la richiamata completamento è in sospeso. Per esempio:

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 .. io ho un dubbio .. secondo le documentazioni: dispatch_async restituisce immediatamente, e poi il blocco viene eseguito in modo asincrono in background. Il mio dubbio è ... dato che stiamo usando dispatch_release dopo la chiamata di inner dispatch_async, non rilascerà il destination_queue prima di eseguire il blocco interno su di esso? – Devarshi

+0

eventualmente, può essere preferibile includere l'apertura dall'interno della richiamata dispatch_async modo: dispatch_async (destination_queue,^{ reply_block (r, err); dispatch_release (destination_queue);}); – ACBurk

+0

Credo che la coda verrà mantenuta alla creazione del blocco, non quando viene eseguita. –

Problemi correlati