Funktioniert dispatch_async (dispatch_get_main_queue (), ^ {…}); Warten bis fertig?

Ich habe ein Szenario in meiner App, in dem ich eine zeitaufwendige Aufgabe ausführen möchte, die aus einer Datenverarbeitung sowie einer Aktualisierung der Benutzeroberfläche in einer Methode besteht. Meine Methode sieht so aus,

- (void)doCalculationsAndUpdateUIs {

    // DATA PROCESSING 1
    // UI UPDATE 1

    // DATA PROCESSING 2
    // UI UPDATE 2

    // DATA PROCESSING 3
    // UI UPDATE 3
} 

Da es zeitaufwändig ist, wollte ich die Datenverarbeitung im Hintergrund-Thread mit

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{

Da sowohl die Datenverarbeitung als auch die Benutzeroberflächenaktualisierungen dieselbe Methode verwenden, wollte ich nur die Benutzeroberflächenaktualisierungen im Hauptthread verschieben.

dispatch_async(dispatch_get_main_queue(), ^{

Schließlich sieht meine Methode so aus,

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

Funktioniert das wirklich? Ist das wirklich eine gute Übung? Was ist der beste Weg, um dies zu erreichen?

P.S. Alle diese drei Operationen hängen miteinander zusammen.

BEARBEITEN: Tut mir leid, Leute. ich habehabe eine Zeile im obigen Code verpasst. Mein aktueller Code sieht so aus.

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

Ich entschuldige mich noch einmal für die Verwirrung.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage