2012-07-18 12 views
6

Quindi in pratica devo essere in grado di eseguire un seguito dopo che un blocco ha finito di funzionare. Ho un blocco che fa alcune cose JSON e ho bisogno di sapere quando ha finito di funzionare.come controllare che un blocco di dispatch_async abbia finito di funzionare

Ho una coda che ho chiamato json_queue.

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

Ho poi un blocco dispatch_async con la seguente sintassi:

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

E non lo lascerà eseguo la linea: "[sé performSegueWithIdentifier: @" modaltomenu "mittente: self];"

Si è tentato di ottenere il blocco Web da una filettatura diversa dalla filettatura principale o dalla bobina. Questo potrebbe essere il risultato di una chiamata a UIKit da un thread secondario. Crashing now ...

Dove posso controllare per sapere quando il thread ha fatto il suo lavoro sporco, quindi posso chiamare il seguito?

Grazie persone carine.

PS: la birra e up e orsacchiotti e fiori a chi può aiutare < 3.

risposta

26

si dovrebbe chiamare i metodi di interfaccia utente su un solo thread principale. Prova a inviare performSegueWithIdentifier: sulla coda principale:

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

signore, lei ha voti positivi e birra. (questa è la risposta che stavo cercando!). Ho completamente dimenticato che potevi tornare alla mainqueue in qualsiasi momento. brillante. – jimbob

+0

Sono nuovo di questa roba. Perché è meglio di usare performSelectorOnMainThread all'interno del blocco? –

+0

@jimbob Devo dire che usare in questo caso "dispatch_sync' invece di' dispatch_async' in terza riga sarebbe meglio (ho modificato quello). Questo modello è consigliato nel video della sessione 206 WWDC2010. @ranReloaded L'utilizzo di un altro blocco è più conveniente perché non è necessario creare un metodo completamente nuovo per un'attività così semplice, e ciò che è fantastico, è possibile accedere a tutte le variabili nell'ambito della definizione dei blocchi. – Johnnywho

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

     }); 
    }); 
+0

ho votato perché è anche la risposta corretta ma sfortunatamente il ragazzo sopra ha risposto con qualche informazione in più. Ma grazie mille! – jimbob

Problemi correlati