Pattern para la prueba de unidad de cola asíncrona que llama a la cola principal al finalizar

Esto está relacionado con mi @ anteripregunt, pero lo suficientemente diferente como para pensar que lo lanzaría en uno nuevo. Tengo un código que se ejecuta de forma asíncrona en una cola personalizada, luego ejecuta un bloque de finalización en el hilo principal cuando se completa. Me gustaría escribir pruebas unitarias en torno a este método. Mi método enMyObject Se ve como esto

+ (void)doSomethingAsyncThenRunCompletionBlockOnMainQueue:(void (^)())completionBlock {

    dispatch_queue_t customQueue = dispatch_queue_create("com.myObject.myCustomQueue", 0);

    dispatch_async(customQueue, ^(void) {

        dispatch_queue_t currentQueue = dispatch_get_current_queue();
        dispatch_queue_t mainQueue = dispatch_get_main_queue();

        if (currentQueue == mainQueue) {
            NSLog(@"already on main thread");
            completionBlock();
        } else {
            dispatch_async(mainQueue, ^(void) {
                NSLog(@"NOT already on main thread");
                completionBlock();
        }); 
    }
});

}

ancé la prueba de cola principal para mayor seguridad, pero siempre llega a ladispatch_async. La prueba de mi unidad se parece a la siguiente.

- (void)testDoSomething {

    dispatch_semaphore_t sema = dispatch_semaphore_create(0);

    void (^completionBlock)(void) = ^(void){        
        NSLog(@"Completion Block!");
        dispatch_semaphore_signal(sema);
    }; 

    [MyObject doSomethingAsyncThenRunCompletionBlockOnMainQueue:completionBlock];

    // Wait for async code to finish
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    dispatch_release(sema);

    STFail(@"I know this will fail, thanks");
}

Creo un semáforo para evitar que la prueba finalice antes que el código asíncrono. Esto funcionaría muy bien si no requiero que el bloque de finalización se ejecute en el hilo principal. Sin embargo, como un par de personas señalaron en la pregunta a la que me vinculé anteriormente, el hecho de que la prueba se ejecute en el hilo principal y luego coloque el bloque de finalización en el hilo principal significa que simplemente colgaré para siempre.

Llamar a la cola principal desde una cola asíncrona es un patrón que veo mucho para actualizar la interfaz de usuario y demás. ¿Alguien tiene un mejor patrón para probar el código asíncrono que vuelve a llamar a la cola principal?