检测我创建的队列当前是否正在使用的最佳/最简单方法是什么?我的目的是推迟特定操作,直到所有排队的任务完成。
谢谢,
道格
更新
这里有更多背景信息。我有一个异步串行队列(私有(private)调度队列),它是我的对象的属性。当此队列完成其工作时,它会调用 dispatch_async(dispatch_get_main_queue(), {...})
来更新 UI。目前该应用程序仅以横向界面方向运行。我现在添加对纵向和横向界面方向的支持。目前,我不想在 GCD 异步任务运行时允许界面在纵向/横向之间旋转。因此,在我的 Controller 的 shouldAutorotateToInterfaceOrientation:
方法中,我想在这些期间返回 NO
。
最佳答案
GCD 中没有对此的直接支持。不过,您也许可以通过其他方式获得您想要的效果。
您只想在其他 block 完成后运行一个 block 吗?将 block 放入
dispatch_group
中,并使用dispatch_group_notify
提交“一切完成后的操作”。这适用于并发或顺序队列。同样,将 block 放入一个组中,然后调用
dispatch_group_wait(group, DISPATCH_TIME_NOW)
。如果它返回非零,则该组中有未完成的 block 。您的队列是顺序的吗?您想等待其他 block 完成,然后阻塞当前线程吗?只需在同一队列上使用
dispatch_sync
发出处理程序即可。
还有其他可能性,具体取决于您的具体情况。
编辑:根据您的更新,有一种更简单的方法:
- 向 View Controller 添加一个名为
allowsOrientationChange
的BOOL
属性 - 覆盖
-shouldAutorotateToInterfaceOrientation:
以返回self.allowsOrientationChange
- 在工作 block 开始时,执行
dispatch_async
将属性设置为 NO - 在工作 block 末尾,执行
dispatch_async
将属性设置为 YES
(当主线程上的属性设置为 NO 和其余工作在队列中发生时之间存在一点竞争条件。您可以将其设为 dispatch_sync
如果这真的很重要。我想这取决于您阻止轮换的原因。)
关于ios5 - 大中央调度。如何查询队列以查看它是否正在使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9777741/