2012-07-18 20 views
6

Así que, básicamente, necesito poder ejecutar un segue después de que un bloque haya terminado de ejecutarse. Tengo un bloque que hace algunas cosas JSON y necesito saber cuándo ha terminado de ejecutarse.cómo comprobar que un bloque dispatch_async ha terminado de ejecutarse

Tengo una cola a la que he llamado json_queue.

jsonQueue = dispatch_queue_create("com.jaboston.jsonQueue", NULL); 

entonces tengo un bloque dispatch_async con esta sintaxis:

dispatch_async(jsonQueue, ^{ 
    [self doSomeJSON]; 
    [self performSegueWithIdentifier:@"modaltomenu" sender:self]; 
    }); 

no va dejar que me realizo la línea: "[performSegueWithIdentifier auto: @" modaltomenu "remitente: auto];"

Se intentó obtener el bloqueo de web de una hebra que no sea la hebra principal o la hebra web. Esto puede ser el resultado de llamar a UIKit desde un hilo secundario. Chocando ahora ...

¿Dónde puedo comprobar para averiguar cuándo el hilo ha hecho su trabajo sucio para que pueda llamar a la segue?

Gracias gente encantadora.

PS: cerveza y ups y osos de peluche y flores a todo el que pueden ayudar a < 3.

Respuesta

26

usted debe llamar a los métodos de interfaz de usuario en el hilo principal solamente. Intenta enviar performSegueWithIdentifier: en la cola principal:

dispatch_async(jsonQueue, ^{ 
    [self doSomeJSON]; 
    dispatch_sync(dispatch_get_main_queue(), ^{ 
     [self performSegueWithIdentifier:@"modaltomenu" sender:self]; 
    }); 
}); 
+0

usted señor tiene voto popular y cerveza. (¡Esa es la respuesta que estaba buscando!). Me olvidé por completo de que podrías regresar a la cola principal en cualquier momento. brillante. – jimbob

+0

Soy nuevo en esto. ¿Por qué es esto mejor que usar performSelectorOnMainThread dentro del bloque? –

+0

@jimbob Debería haber mencionado, que usar 'dispatch_sync' en lugar de' dispatch_async' en tercera línea sería mejor en este caso (he editado eso). Este patrón se recomienda en WWDC2010 Session 206 video. @ranReloaded Usar otro bloque es más conveniente porque no necesita crear un método completamente nuevo para una tarea tan simple, y lo mejor es que puede acceder a todas las variables dentro del alcance de la definición de bloque. – Johnnywho

5
dispatch_async(jsonQueue, ^{ 
     [self doSomeJSON]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self performSegueWithIdentifier:@"modaltomenu" sender:self]; 
      //Finished with async block 

     }); 
    }); 
+0

Lo voté porque también es la respuesta correcta, pero desafortunadamente el chico de arriba respondió con un poco de información extra. ¡Pero muchas gracias! – jimbob

Cuestiones relacionadas