Гранд Централ Диспетчер.Как я могу запросить очередь, чтобы узнать, используется ли она? - PullRequest
2 голосов
/ 20 марта 2012

Какой самый лучший / самый простой способ определить, используется ли созданная мной очередь в настоящее время? Мое намерение здесь состоит в том, чтобы отложить определенное действие, пока все задачи в очереди не будут выполнены.

Спасибо
Дуг

UPDATE

Здесь немного больше контекста. У меня есть асинхронная последовательная очередь (частная очередь отправки), которая является свойством моего объекта. Когда эта очередь завершает свою работу, она вызывает dispatch_async(dispatch_get_main_queue(), {...}) для обновления пользовательского интерфейса. В настоящее время приложение работает только в альбомной ориентации. Сейчас я добавляю поддержку как книжной, так и альбомной ориентации интерфейса. На данный момент я предпочитаю не позволять интерфейсу поворачиваться в / из портрета / ландшафта, пока выполняется моя асинхронная задача GCD. Поэтому в методе shouldAutorotateToInterfaceOrientation: моего контроллера я хочу вернуть NO в течение этих периодов.

Ответы [ 2 ]

2 голосов
/ 20 марта 2012

Нет прямой поддержки этого в GCD.Возможно, вы можете получить эффект, который вы ищете, другими способами.

  • Вы хотите запустить блок после завершения других блоков?Поместите блоки в dispatch_group и отправьте «после того, как все сделано», используя dispatch_group_notify.Это работает с параллельными или последовательными очередями.

  • Аналогично, поместите свои блоки в группу и вызовите dispatch_group_wait(group, DISPATCH_TIME_NOW).Если он возвращает ненулевое значение, то в группе есть незавершенные блоки.

  • Последовательна ли ваша очередь, и вы хотите дождаться завершения других блоков, блокируя текущий поток дозатем?Просто введите обработчик, используя dispatch_sync в той же очереди.

Существуют и другие возможности, в зависимости от вашей конкретной ситуации.

Редактировать: Основываясь на вашем обновлении, есть еще более простой способ:

  • добавить свойство BOOL к вашему контроллеру представления, которое называется allowsOrientationChange
  • override -shouldAutorotateToInterfaceOrientation:, чтобы вернуть self.allowsOrientationChange
  • в начале вашего рабочего блока, выполните dispatch_async, чтобы установить для свойства значение NO
  • , в конце вашего рабочего блока, выполните dispatch_async, чтобы установить для свойства значение YES.

(Есть небольшое условие гонки между тем, когда для свойства установлено значение NO в главном потоке, и когда остальная часть вашей работы происходит в очереди. Вы можете сделать это dispatch_sync если это действительно имеет значение. Зависит от того, каковы ваши причины для предотвращения вращения, я полагаю.)

1 голос
/ 20 марта 2012

Если вы управляете всеми задачами, поступающими в очередь, завершение которых вас волнует, вы можете использовать API диспетчерской группы , чтобы сгруппировать их и получать уведомления об их завершении.Если вы не используете очередь, задачи которой вы полностью контролируете, вы можете свернуть свое собственное уведомление, поставив в очередь блок, единственной целью которого является генерация такого уведомления (хотя это действительно только в том случае, если вы используете последовательный порт).очереди).

...