Padrão para a fila assíncrona de teste de unidade que chama a fila principal após a conclusão

Isso está relacionado ao meu @ anteriquestã, mas diferente o suficiente para que eu pensasse em colocá-lo em um novo. Eu tenho algum código que executa assíncrono em uma fila personalizada e, em seguida, executa um bloco de conclusão no segmento principal. Eu gostaria de escrever um teste de unidade em torno deste método. Meu método emMyObject se parece com isso

+ (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();
        }); 
    }
});

}

Fiz o teste da fila principal para segurança extra, mas sempre atinge odispatch_async. Meu teste de unidade é semelhante ao seguinte.

- (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");
}

Crio um semáforo para impedir que o teste seja concluído antes do código assíncrono. Isso funcionaria muito bem se eu não exigisse que o bloco de conclusão fosse executado no thread principal. No entanto, como algumas pessoas apontaram na pergunta acima, o fato de o teste estar sendo executado no thread principal e enfileirar o bloco de conclusão no thread principal significa que ficarei travado para sempr

Chamar a fila principal de uma fila assíncrona é um padrão que vejo muito para atualizar a interface do usuário e tal. Alguém tem um padrão melhor para testar código assíncrono que chama de volta para a fila principa

questionAnswers(6)

yourAnswerToTheQuestion