В моем приложении есть сценарий, в котором я хочу выполнить трудоемкую задачу, состоящую из некоторой обработки данных, а также обновления пользовательского интерфейса в методе. Мой метод выглядит так,
- (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. Все эти три операции взаимосвязаны друг с другом.
РЕДАКТИРОВАТЬ: Извините, ребята. Я пропустил строку в приведенном выше коде. Мой код выглядит так.
- (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
может быть здесь полезен ... - person Dave DeLong   schedule 05.07.2013dispatch_sync
, потому что это кажется логичным, но на самом деле часто в этом нет необходимости. EmptyStack не рассказал, почему он хочет подождать, поэтому мы не можем посоветовать, хорошая это идея или нет. - person Rob   schedule 05.07.2013dispatch_sync
может быть очень опасным, потому что таким образом гораздо проще зайти в тупик. Но иногда это правильно. :) - person Dave DeLong   schedule 05.07.2013