2011-11-30 12 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!"); 

El problema es que "¡Gran éxito!" nunca aparece, y nada sucede más allá del final del código más externo dispatch_async bloque. No estoy seguro de lo que estoy haciendo mal, pero sé que algo está muy mal con esto.dispatch_async una cola personalizada nunca sale del bloque

+0

Probé tu código, y está funcionando: http://pastie.org/2944762 –

+0

De hecho es ... Así que tiene que ver con la cola de descarga que se lanza temprano, se está tomando un tiempo para descargar, supongo. –

Respuesta

4

Usted está liberando su cola de descarga demasiado pronto. Debe esperar hasta después de haber ejecutado el bloque. El dispatch_async man page sugiere poner el lanzamiento al final del bloque.

Es importante recordar para retener la cola de destino antes de la primera llamada a dispatch_async(), y liberar esa cola al final de la devolución de llamada finalización para garantizar la cola de destino no se cancela la asignación, mientras que la devolución de llamada finalización está pendiente.

2

Hay un par de problemas con este código:

  1. No es necesario conservar el callerQueue después de crearlo. Ya se creó con retención de 1 y presumiblemente desaparecerá una vez que lo libere más tarde. Al retenerlo dos veces, potencialmente está creando una fuga.

  2. Nunca debe hacer operaciones de IU en ninguna cola que no sea la cola principal (no la llamada que llama en este caso).

El resto del código se ve bien (y que no tiene que liberar la cola de descarga desde el interior del bloque, como otros están sugiriendo, ya que la llamada dispatch_async() también retenerlo. Tiene que haber más a este fragmento de código que nos falta (como, ¿el código sale justo después de hacer el NSLog()?).

Cuestiones relacionadas