Нет прямой поддержки этого в 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
если это действительно имеет значение. Зависит от того, каковы ваши причины для предотвращения вращения, я полагаю.)