Para el caso de despacho asíncrono que describió anteriormente, no debería necesitar verificar si está en el hilo principal. Como indica Bavarious, esto simplemente se pondrá en cola para ejecutarse en el hilo principal.
Sin embargo, si intenta hacer lo anterior usando dispatch_sync()
ay su devolución de llamada está en el hilo principal, su aplicación se bloqueará en ese punto. Describo esto en mi respuesta aquí , porque este comportamiento me sorprendió al mover algo de código -performSelectorOnMainThread:
. Como mencioné allí, creé una función auxiliar:
void runOnMainQueueWithoutDeadlocking(void (^block)(void))
{
if ([NSThread isMainThread])
{
block();
}
else
{
dispatch_sync(dispatch_get_main_queue(), block);
}
}
que ejecutará un bloque sincrónicamente en el hilo principal si el método en el que se encuentra no está actualmente en el hilo principal, y simplemente ejecuta el bloque en línea si lo es. Puede utilizar una sintaxis como la siguiente para usar esto:
runOnMainQueueWithoutDeadlocking(^{
//Do stuff
});