ios5 - 大中央调度。如何查询队列以查看它是否正在使用?

标签 ios5 asynchronous grand-central-dispatch

检测我创建的队列当前是否正在使用的最佳/最简单方法是什么?我的目的是推迟特定操作,直到所有排队的任务完成。

谢谢,
道格

更新

这里有更多背景信息。我有一个异步串行队列(私有(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 添加一个名为 allowsOrientationChangeBOOL 属性
  • 覆盖-shouldAutorotateToInterfaceOrientation:以返回self.allowsOrientationChange
  • 在工作 block 开始时,执行 dispatch_async 将属性设置为 NO
  • 在工作 block 末尾,执行 dispatch_async 将属性设置为 YES

(当主线程上的属性设置为 NO 和其余工作在队列中发生时之间存在一点竞争条件。您可以将其设为 dispatch_sync如果这真的很重要。我想这取决于您阻止轮换的原因。)

关于ios5 - 大中央调度。如何查询队列以查看它是否正在使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9777741/

相关文章:

ios - dispatch_get_main_queue 在 iOS 8 中弃用

ios - AFNetworking http 客户端不发送 JSON 参数

javascript - 我怎样才能让 redux 派发一个 Action 并返回一个 promise ?

concurrency - 使用 dispatch_async 的 EXC_BAD_ACCESS

node.js - Firebase 查询快照未定义

swift - 从服务器异步下载信息

ios - 确保不同部分的代码在 iOS 的后台队列中运行

iphone - 在获取数组中选择单个字段以加载选择器

iphone - 使用计数值对数组进行排序

ios - 如何从 subview Controller 访问父 View Controller 的 View ?