// Method called when a button is clicked
- (void)handleClickEvent {
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self backgroundProcessing];
});
// Some code to update the UI of the view
....
[self updateUI];
....
}
1) handleClickEvent вызывается в основном потоке при нажатии кнопки в представлении.
2) Я использовал dispatch_sync(), потому что следующий код, который обновляет пользовательский интерфейс представления, не может быть выполнен до тех пор, пока не будет вычислена переменная в методе backgroundProcessing.
3) Я использовал dispatch_get_global_queue, чтобы отключить фоновую обработку от основного потока. (следуя правилу: обычно отключайте фоновую обработку от основного потока и обычно помещайте код, влияющий на пользовательский интерфейс, в основной поток).
Мой вопрос: метод backgroundProcessing «подвешивает» основной поток до его завершения, так как я использую dispatch_sync?
EDIT: На основе приведенного ниже ответа я реализовал это решение:
- (void)handleClickEvent {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self backgroundProcessing];
dispatch_async(dispatch_get_main_queue(), ^{
[self updateUI];
});
});
}
решение по этой ссылке: Вызовы завершения< /а>