Czy dispatch_async (dispatch_get_main_queue (), ^ {…}); poczekaj, aż skończysz?

W mojej aplikacji mam scenariusz, w którym chcę wykonać czasochłonne zadanie, które polega na przetwarzaniu danych oraz aktualizacji interfejsu użytkownika w metodzie. Moja metoda wygląda tak,

- (void)doCalculationsAndUpdateUIs {

    // DATA PROCESSING 1
    // UI UPDATE 1

    // DATA PROCESSING 2
    // UI UPDATE 2

    // DATA PROCESSING 3
    // UI UPDATE 3
} 

Ponieważ jest to czasochłonne, chciałem wykonać przetwarzanie danych w wątku w tle, używając,

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{

Ale ponieważ zarówno przetwarzanie danych, jak i aktualizacje interfejsu użytkownika są w tej samej metodzie, chciałem przenieść tylko aktualizacje interfejsu użytkownika w głównym wątku, używając,

dispatch_async(dispatch_get_main_queue(), ^{

Wreszcie moja metoda wygląda tak,

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

Czy to naprawdę działa? Czy to naprawdę dobra praktyka? Jaki jest najlepszy sposób osiągnięcia tego celu?

P.S. Wszystkie te trzy operacje są ze sobą powiązane.

EDYTOWAĆ: Przepraszam chłopaki. mambrakowało linii w powyższym kodzie. Mój aktualny kod wygląda tak.

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

Jeszcze raz bardzo przepraszam za zamieszanie.

questionAnswers(8)

yourAnswerToTheQuestion