Mulithreading: ejecutar llamadas de método solo después de terminar de ejecutar otro método

Estoy tratando de procesar el método de forma asíncrona, según los requisitos, una vez que el primer método se haya completado, solo entonces el segundo método debería comenzar a ejecutarse. El problema es que el primer método en sí tiene un código que se ejecuta en un subproceso en segundo plano.

Intenté dispatch_semaphore_wait, pero eso tampoco funcionó.

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);

        dispatch_group_t group = dispatch_group_create();


        dispatch_group_async(group, queue, ^{

            [self firstMethod];
            NSLog(@"firstMethod Done");

        });
        dispatch_group_notify(group, queue, ^ {

            NSLog(@"1st method completed");
            NSLog(@"2nd method starting");

            [self secondMethod];

        });

FirstMethod se ejecuta en otro hilo de trabajo como este

-(void)firstMethod
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
   //processing here.....       

 }];

¿Cuál es la mejor manera de lograrlo? No puedo cambiar la definición de FirstMethod tal como lo proporcionó un tercero, y también cambiarlo significa cambiar muchos códigos existentes desde donde se llama a este método

Respuestas a la pregunta(2)

Su respuesta a la pregunta