Grand Central Dispatch (GCD) vs. performSelector - necesito una mejor explicación

He usado GCD y performSelectorOnMainThread: waitUntilDone en mis aplicaciones, y tiendo a pensar que son intercambiables, es decir, performSelectorOnMainThread: waitUntilDone es un contenedor Obj-C para la sintaxis GCD C. He estado pensando en estos dos comandos como equivalentes:

dispatch_sync(dispatch_get_main_queue(), ^{ [self doit:YES]; });


[self performSelectorOnMainThread:@selector(doit:) withObject:YES waitUntilDone:YES];

¿Soy incorrecto? Es decir, ¿hay alguna diferencia entre los comandos performSelector * y los GCD? He leído mucha documentación sobre ellos, pero aún no he visto una respuesta definitiva.

Respuestas a la pregunta(3)

Su respuesta a la pregunta