У меня есть сценарий в моем приложении, где я хочу выполнить некоторую трудоемкую задачу, которая состоит из некоторой обработки данных, а также обновления пользовательского интерфейса в методе. Мой метод выглядит так,Does 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), ^{
Но как обновления и обработки данных и пользовательского интерфейса находятся в Тот же метод, что я хотел, чтобы переместить только UI обновления в основном потоке с использованием,
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
});
});
}
Еще раз, я действительно извиняюсь за замешательство.
Возможно 'dispatch_sync' может быть полезным здесь ... –
@DaveDeLong Возможно. Я вижу разработчиков, использующих 'dispatch_sync', потому что это кажется логичным, но на самом деле это часто не нужно. EmptyStack не поделился тем, почему он хочет подождать, так что нам нельзя советовать, хорошая ли это идея или нет. – Rob
@Rob yep, 'dispatch_sync' может быть очень опасным, потому что намного легче зайти в тупик. Но * иногда * это правильная вещь. :) –