Para o caso de envio assíncrono descrito acima, não é necessário verificar se você está no thread principal. Como indica Bavarious, isso simplesmente será colocado na fila para ser executado no thread principal.
No entanto, se você tentar fazer o acima usando dispatch_sync()
ae seu retorno de chamada estiver no thread principal, seu aplicativo entrará em conflito nesse momento. Eu descrevo isso na minha resposta aqui , porque esse comportamento me surpreendeu ao mover algum código de -performSelectorOnMainThread:
. Como mencionei lá, criei uma função auxiliar:
void runOnMainQueueWithoutDeadlocking(void (^block)(void))
{
if ([NSThread isMainThread])
{
block();
}
else
{
dispatch_sync(dispatch_get_main_queue(), block);
}
}
que executará um bloco de forma síncrona no segmento principal se o método em que você está atualmente não estiver no segmento principal e apenas executará o bloco em linha, se estiver. Você pode empregar sintaxe como a seguinte para usar isso:
runOnMainQueueWithoutDeadlocking(^{
//Do stuff
});