2011-11-30 9 views
5
dispatch_queue_t callerQueue = dispatch_get_current_queue(); 
dispatch_retain(callerQueue); 
dispatch_queue_t downloadQueue = dispatch_queue_create("Download Queue",NULL); 

dispatch_async(downloadQueue, 
^{ 
    //some code that accesses a web service 
    dispatch_async(callerQueue, 
    ^{ 
     //some code that accesses UI 
    }); 
}); 
dispatch_release(downloadQueue); 
NSLog(@"great successing!"); 

Il problema è che "Grande successo!" non si presenta mai e non succede mai oltre la fine del codice più esterno del blocco dispatch_async. Non sono sicuro di cosa sto sbagliando, ma so che c'è qualcosa di veramente sbagliato in questo.dispatch_async una coda personalizzata non esce mai dal blocco

+0

Provato il tuo codice, e funziona: http://pastie.org/2944762 –

+0

Effettivamente è ... Quindi deve avere a che fare con la coda di download rilasciata in anticipo, ci sto mettendo un po 'a scaricare credo. –

risposta

4

Si sta scaricando la coda di download troppo presto. È necessario attendere fino a quando non ha eseguito il blocco. Il dispatch_async man page suggerisce di mettere il rilascio alla fine del blocco.

E 'importante ricordarsi di mantenere la coda di destinazione prima che la prima chiamata a dispatch_async(), e di rilasciare quella coda alla fine della richiamata di completamento per garantire la coda di destinazione non viene deallocato mentre il callback di completamento è in sospeso.

2

Ci sono un paio di problemi con questo codice:

  1. Non è necessario per mantenere il callerQueue dopo averlo creato. È già stato creato con il numero di ritenzione di 1 e presumibilmente andrà via una volta rilasciato in seguito. Mantenendolo due volte, si sta potenzialmente creando una perdita.

  2. Non si dovrebbero mai eseguire operazioni UI su una coda diversa dalla coda principale (non in questo caso il callerQueue).

Il resto del codice guarda bene (e non si deve rilasciare la coda di download all'interno del blocco, come altri suggeriscono, in quanto la chiamata dispatch_async() anche conservarlo. Ci deve essere più a questo frammento di codice ci stiamo perdendo (come, il codice esce subito dopo aver fatto NSLog()?).

Problemi correlati