Вызывает ли зависание приложение dispatch_sync (dispatch_get_global_queue ()) в главном потоке? - PullRequest
4 голосов
/ 09 января 2012
// 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 из основного потока.(следуя правилу: обычно помещают фоновую обработку из основного потока и обычно помещают код, который влияет на пользовательский интерфейс в основном потоке).

Мой вопрос таков: метод backgroundProcessing "вешает" основной поток до его завершения?так как я использую dispatch_sync?

РЕДАКТИРОВАТЬ: Основываясь на ответе ниже, я реализовал это решение:

- (void)handleClickEvent {
      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
         [self backgroundProcessing];
         dispatch_async(dispatch_get_main_queue(), ^{
            [self updateUI];
         });
      });
}

решение по этой ссылке: Завершение Callbaks

1 Ответ

7 голосов
/ 09 января 2012

Да, dispatch_sync будет блокироваться, пока задача не будет завершена. Используйте dispatch_async, и когда задание будет выполнено, отправьте блок обратно в основную очередь, чтобы обновить представление.

...