iPhone - 取消排队操作 GCD

标签 iphone ios grand-central-dispatch

我有几个任务被分派(dispatch)到串行队列,特别是一些被分派(dispatch)到组的任务。在调度这些任务后,我想给用户取消它们的选项,即使它们已经被执行。

我找不到任何方法来取消排队的任务,然后我想我可以创建一个 bool 标志,例如,quitRender 并测试该标志是否为真并退出渲染,但这不起作用,我的解释是:当任务被触发时,标志 quitRender 为 NO,因此它们在 block 中执行并且 block 卡住它们开始时的值, block 将不会看到更改并且永远不会退出。

然后我尝试了另一种方法:我创建了一个类似的方法

- (BOOL) cancelRender {
    return quitRender;
}

这将运行并向 block 发送变量的当前值,但显然这些 block 继续看到 QuitRender 的 NO。

我错过了什么吗?如何使这项工作?

谢谢。

最佳答案

__block 存储修饰符在这种情况下可能会有所帮助。

__block BOOL quitRender = NO;

它使得能够从 block 中修改变量,并且 block 可以看到修改后的变量。但请注意,访问 __block 变量不是线程安全的。

atomic functions最好确保以原子方式访问变量。

您也可以从 block 中使用 ivar。如果变量是具有原子属性的属性,则访问它是线程安全的。

你如何使用 quitRender 变量?

编辑 :
__block int32_t quitRender = 0;

/* set */
OSAtomicOr32(1, &quitRender);

/* test */
if (quitRender) {

关于iPhone - 取消排队操作 GCD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5255750/

相关文章:

iphone - iOS 本地化 - 仅使用新字符串更新 Localizable.strings

ios - 如何使用 iPhone 计算划艇的划水频率?

ios - 如何在按住表格 View 单元格时逐渐增加它的大小

ios - Swift:UITableViewCell 中的手势不起作用

fonts - OpenGL-ES 字体渲染(在 iOS 上)...完整性检查

iphone - 如何删除特定用户 iPhone 上的 iOS 企业应用程序

ios - 提供带有目标回调队列的异步和同步 API

ios - 递归函数调用时的 Swiftdispatch_group 奇怪行为

iphone - 实现自定义 UIScrollView

ios - dispatch_group_notify 已被实例方法 DispatchGroup.notify(qos :flags:queue:execute:)