Dispatch_async (dispatch_get_main_queue (), ^ {…}); espere até terminar?

Eu tenho um cenário no meu aplicativo, onde eu quero fazer alguma tarefa demorada que consiste em algum processamento de dados, bem como atualização da interface do usuário, em um método. Meu método é assim,

- (void)doCalculationsAndUpdateUIs {

    // DATA PROCESSING 1
    // UI UPDATE 1

    // DATA PROCESSING 2
    // UI UPDATE 2

    // DATA PROCESSING 3
    // UI UPDATE 3
} 

Como é demorado eu queria fazer o processamento de dados no thread de fundo, usando,

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{

Mas como o processamento de dados e as atualizações da interface do usuário estão no mesmo método, eu queria mover apenas as atualizações da interface do usuário no thread principal usando,

dispatch_async(dispatch_get_main_queue(), ^{

Finalmente meu método é assim,

- (void)doCalculationsAndUpdateUIs {

    // DATA PROCESSING 1 
    dispatch_async(dispatch_get_main_queue(), ^{
        // UI UPDATE 1
    });

    /* I expect the control to come here after UI UPDATE 1 */

    // DATA PROCESSING 2
    dispatch_async(dispatch_get_main_queue(), ^{
        // UI UPDATE 2
    });

    /* I expect the control to come here after UI UPDATE 2 */

    // DATA PROCESSING 3
    dispatch_async(dispatch_get_main_queue(), ^{
        // UI UPDATE 3
    });
}

Isso realmente funciona? Isso é realmente uma boa prática? Qual a melhor maneira de alcançar isto?

P.S. Todas essas três operações estão inter-relacionadas entre si.

EDITAR: Desculpem rapazes. eu tenhoperdeu uma linha no código acima. Meu código atual se parece com isso.

- (void)doCalculationsAndUpdateUIs {

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        // DATA PROCESSING 1 
        dispatch_async(dispatch_get_main_queue(), ^{
            // UI UPDATE 1
        });

        /* I expect the control to come here after UI UPDATE 1 */

        // DATA PROCESSING 2
        dispatch_async(dispatch_get_main_queue(), ^{
            // UI UPDATE 2
        });

        /* I expect the control to come here after UI UPDATE 2 */

        // DATA PROCESSING 3
        dispatch_async(dispatch_get_main_queue(), ^{
            // UI UPDATE 3
        });
    });
}

Mais uma vez, peço desculpas pela confusão.

questionAnswers(8)

yourAnswerToTheQuestion