检测我创建的队列当前是否正在使用的最佳/最简单方法是什么?我的目的是推迟特定操作,直到所有排队任务完成。
谢谢,
道格
这是一个更多的背景。我有一个异步串行队列(私有调度队列),它是我的对象的属性。当此队列完成其工作时,它会调用dispatch_async(dispatch_get_main_queue(), {...})
来更新UI。目前,该应用仅在横向界面方向上运行。我现在正在增加对肖像和画像的支持。景观界面方向。现在,我不希望在我的GCD异步任务运行时允许界面旋转到/从纵向/横向旋转。因此,在我的控制器的shouldAutorotateToInterfaceOrientation:
方法中,我希望在这些时段内返回NO
。
答案 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将它们组合在一起,并在完成后收到通知。如果您没有使用完全可以控制其任务的队列,则可以通过排队一个块来滚动您自己的通知,该块的唯一目的是生成此类通知(尽管这实际上仅适用于您使用序列的情况队列)。