Como Jacob señala, aunque puedan parecer lo mismo, son cosas diferentes. De hecho, hay una diferencia significativa en la forma en que manejan el envío de acciones al hilo principal si ya se está ejecutando en el hilo principal.
Me encontré con esto recientemente, donde tenía un método común que a veces se ejecutaba desde algo en el hilo principal, a veces no. Para proteger ciertas actualizaciones de UI, he estado usando -performSelectorOnMainThread:
para ellos sin problemas.
Cuando cambié a usar dispatch_sync
en la cola principal, la aplicación se bloquea cuando este método se ejecuta en la cola principal. La lectura de la documentación sobre dispatch_sync
, vemos:
llama a esta función y la orientación los resultados de cola actual en punto muerto.
donde por -performSelectorOnMainThread:
vemos
esperar
booleano que especifica si los secuencias de rosca actual hasta después de que el selector especificado se lleva a cabo en el receptor en el hilo principal . Especifique SÍ para bloquear este hilo; de lo contrario, especifique NO para que este método devuelva inmediatamente.
Si el hilo actual es también el principal hilo, y se especifica SI para este parámetro , el mensaje se entrega y se procesa inmediatamente.
todavía prefiero la elegancia de GCD, comprobando el mejor tiempo de compilación que proporciona, y su mayor flexibilidad en cuanto a los argumentos, etc., por lo que hizo esta pequeña función auxiliar para evitar los puntos muertos:
void runOnMainQueueWithoutDeadlocking(void (^block)(void))
{
if ([NSThread isMainThread])
{
block();
}
else
{
dispatch_sync(dispatch_get_main_queue(), block);
}
}
Actualización: En respuesta a Dave Dribin señalando caveats section ondispatch_get_current_queue()
, he cambiado a usar [NSThread isMainThread]
en el código anterior.
Luego uso
runOnMainQueueWithoutDeadlocking(^{
//Do stuff
});
para realizar las acciones que necesita para asegurar el hilo principal, sin tener que preocuparse acerca de lo que pase el método original fue ejecutado el.
withObject: SÍ no funcionaría y debería darle al menos una advertencia. Lo cual podría ser una ventaja de GDC, donde puede enviar argumentos arbitrarios a un receptor. – FelixLam
Bien, tendría que envolverlo en un NSNumber. Pero, ignorando esa parte, ¿hay algo más que sea diferente? Buen punto, sin embargo. – akaru