Crear un método para realizar animaciones y esperar su finalización utilizando un semáforo en el objetivo c

Estoy tratando de crear un método que utilice el método "+ animateWithDuration: animaciones: finalización" de UIView para realizar animaciones y esperar a que finalice. Soy muy consciente de que podría colocar el código que normalmente vendría después de él en un bloque de finalización, pero me gustaría evitar esto porque hay una cantidad sustancial de código después que incluye más animaciones, lo que me dejaría con bloques anidados .

Traté de implementar este método de la siguiente manera usando un semáforo, pero no creo que esta sea la mejor manera de hacerlo, especialmente porque en realidad no funciona. ¿Alguien puede decirme qué está mal con mi código y / o cuál es la mejor manera de lograr el mismo objetivo?

+(void)animateAndWaitForCompletionWithDuration:(NSTimeInterval)duration animations:(void  (^)(void))animations
{
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    [UIView animateWithDuration:duration
                 animations:animations
                 completion:^(BOOL finished) {
                     dispatch_semaphore_signal(semaphore);
                 }];
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
}

No estoy seguro de lo que está mal con mi código, pero cuando llamo al método como se muestra a continuación, el bloque de finalización nunca se ejecuta y termino en el limbo.

[Foo animateAndWaitForCompletionWithDuration:0.5 animations:^{
    //do stuff
}];

-------------------------------------------EDITAR------ -------------------------------------------

Si alguien se enfrenta a un problema similar, es posible que le interese ver el código que utilicé. Utiliza la recursividad para hacer uso de cada bloque de finalización, sin tener que anidar cada llamada de función.

+(void)animateBlocks:(NSArray*)animations withDurations:(NSArray*)durations {
    [Foo animateBlocks:animations withDurations:durations atIndex:0];
}

+(void)animateBlocks:(NSArray*)animations withDurations:(NSArray*)durations atIndex:(NSUInteger)i {
    if (i < [animations count] && i < [durations count]) {
         [UIView animateWithDuration:[(NSNumber*)durations[i] floatValue]
                          animations:(void(^)(void))animations[i]
                          completion:^(BOOL finished){
             [Foo animateBlocks:animations withDurations:durations atIndex:i+1];
         }];
    } 
}

que se puede usar así

[Foo animateBlocks:@[^{/*first animation*/},
                     ^{/*second animation*/}]
     withDurations:@[[NSNumber numberWithFloat:2.0],
                     [NSNumber numberWithFloat:2.0]]];

Respuestas a la pregunta(5)

Su respuesta a la pregunta