Ho visto alcune domande correlate, ma nessuna sembra rispondere a questo caso. Voglio scrivere un metodo che farà un po 'di lavoro in background. Ho bisogno di questo metodo per chiamare un callback di completamento sullo stesso thread/coda utilizzato per la chiamata del metodo originale.dispatch_async e chiamare un gestore di completamento sulla coda originale
- (void)someMethod:(void (^)(BOOL result))completionHandler {
dispatch_queue_t current_queue = // ???
// some setup code here
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
BOOL ok = // some result
// do some long running processing here
dispatch_async(current_queue, ^{
completionHandler(ok);
});
});
Che incantesimo magico è necessario qui in modo che il gestore di completamento viene chiamato sulla stessa coda o thread come la chiamata a sameMethod
? Non voglio assumere il thread principale. E ovviamente non si deve usare dispatch_get_current_queue
.
Può descrivere cosa si sta cercando di ottenere? Perché è importante per i tuoi scopi specifici su quale thread è stato eseguito? –
@ChristopherPickslay 'someMethod' potrebbe essere chiamato in qualche thread in background. Lo voglio in modo tale che il blocco di completamento venga richiamato sullo stesso thread, non sul thread principale o su qualche altro thread di background arbitrario. – rmaddy
Lo capisco. La domanda è perché. C'è qualche motivo tecnico per cui deve essere invocato su un thread specifico? Sto solo pensando che potrebbe esserci un design diverso che potrebbe aiutare. –