У меня есть сценарий в моем приложении, где я хочу выполнить некоторую трудоемкую задачу, которая состоит из некоторой обработки данных, а также обновления пользовательского интерфейса в методе. Мой метод выглядит следующим образом:
- (void)doCalculationsAndUpdateUIs {
    // DATA PROCESSING 1
    // UI UPDATE 1
    // DATA PROCESSING 2
    // UI UPDATE 2
    // DATA PROCESSING 3
    // UI UPDATE 3
} 
Поскольку требуется много времени, я хотел выполнить обработку данных в фоновом потоке, используя
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{
Но поскольку и обработка данных, и обновления пользовательского интерфейса находятся в одном и том же методе, я хотел переместить только обновления пользовательского интерфейса в основном потоке, используя
dispatch_async(dispatch_get_main_queue(), ^{
Наконец, мой метод выглядит так:
- (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
    });
}
Это действительно работает? Это действительно хорошая практика? Каков наилучший способ достичь этого?
P.S. Все эти три операции взаимосвязаны друг с другом.
EDIT: Извините, ребята. У меня пропущена строка в приведенном выше коде. Мой фактический код выглядит так.
- (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
        });
    });
}
Я снова извиняюсь за путаницу.