Dispatch_async (dispatch_get_main_queue (), ^ {…}); подождать, пока не закончите?
У меня есть сценарий в моем приложении, где я хочу выполнить некоторую трудоемкую задачу, которая состоит из некоторой обработки данных, а также обновления пользовательского интерфейса в методе. Мой метод выглядит так,
- (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
});
}
Это действительно работает? Это действительно хорошая практика? Каков наилучший способ достичь этого?
Постскриптум Все эти три операции взаимосвязаны друг с другом.
РЕДАКТИРОВАТЬ: Извините ребята. у меня естьпропустил строку в приведенном выше коде, Мой реальный код выглядит так.
- (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
});
});
}
Еще раз прошу прощения за путаницу.