Grand Central Dispatch。如何查询队列以查看它是否正在使用?

时间:2012-03-19 20:51:01

标签: ios5 asynchronous grand-central-dispatch

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

谢谢,
道格

更新

这是一个更多的背景。我有一个异步串行队列(私有调度队列),它是我的对象的属性。当此队列完成其工作时,它会调用dispatch_async(dispatch_get_main_queue(), {...})来更新UI。目前,该应用仅在横向界面方向上运行。我现在正在增加对肖像和画像的支持。景观界面方向。现在,我不希望在我的GCD异步任务运行时允许界面旋转到/从纵向/横向旋转。因此,在我的控制器的shouldAutorotateToInterfaceOrientation:方法中,我希望在这些时段内返回NO

2 个答案:

答案 0 :(得分:2)

GCD没有直接的支持。不过,你可能会以其他方式获得你正在寻找的效果。

  • 您是否只想在其他块完成后运行块?将块放在dispatch_group中,然后使用dispatch_group_notify提交“完成所有操作后”。这适用于并发或顺序队列。

  • 同样,将您的区块放入一个组中,然后拨打dispatch_group_wait(group, DISPATCH_TIME_NOW)。如果它返回非零值,则组中有未完成的块。

  • 你的队列是顺序的,你想等到其他块完成,阻塞当前线程直到那时?只需在同一队列中使用dispatch_sync发布处理程序。

根据您的具体情况,还有其他可能性。

修改:根据您的更新,有一种更简单的方法:

  • BOOL属性添加到视图控制器,名为allowsOrientationChange
  • 覆盖-shouldAutorotateToInterfaceOrientation:以返回self.allowsOrientationChange
  • 在工作区开始时,执行dispatch_async将属性设置为NO
  • 在工作区结束时,执行dispatch_async将属性设置为YES

(在主线程上将属性设置为NO,并且在队列中发生其余工作时,会有一点竞争条件。如果确实如此,您可以将其设为dispatch_sync问题。我想,取决于你防止轮换的原因。)

答案 1 :(得分:1)

如果您控制了所有关注完成的队列中的任务,您可以使用dispatch group APIs将它们组合在一起,并在完成后收到通知。如果您没有使用完全可以控制其任务的队列,则可以通过排队一个块来滚动您自己的通知,该块的唯一目的是生成此类通知(尽管这实际上仅适用于您使用序列的情况队列)。