iPhone-取消排队操作GCD

iPhone-取消排队操作GCD,iphone,ios,grand-central-dispatch,Iphone,Ios,Grand Central Dispatch,我有几个任务被分派到串行队列,特别是一些任务被分派到一个组。在分派这些任务之后,我想给用户取消它们的选项,即使它们已经被执行 我找不到任何方法来取消排队的任务,然后我想象我可以创建一个布尔标志,例如,quitRender并测试该标志是否为true,然后退出渲染,但这不起作用,我的解释是:当启动任务时,quitRender标志为NO,因此,当它们在块中执行时,块将冻结它们启动时的值,块将不会看到更改,也永远不会退出 然后我尝试了另一种方法:我创建了一个 - (BOOL) cancelRender

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

我找不到任何方法来取消排队的任务,然后我想象我可以创建一个布尔标志,例如,quitRender并测试该标志是否为true,然后退出渲染,但这不起作用,我的解释是:当启动任务时,quitRender标志为NO,因此,当它们在块中执行时,块将冻结它们启动时的值,块将不会看到更改,也永远不会退出

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

- (BOOL) cancelRender {
    return quitRender;
}
这将运行并向块发送变量的当前值,但显然,块继续看不到quitRender

我错过什么了吗?我该怎么做


谢谢。

如果您想退出给定类的所有任务,可以尝试将quitRender标志设置为易失性静态BOOL全局变量,块代码不应冻结该变量


您可以将getter和setter包装在静态全局变量周围,以使代码更干净。

如果您想退出给定类的所有任务,可以尝试将quitRender标志设置为易失性静态BOOL全局变量,块代码不应冻结该变量


您可以围绕静态全局变量包装getter和setter,以使代码更干净。

\u块存储修饰符在这种情况下可能会有所帮助

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

最好确保以原子形式访问变量

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

如何使用quitRender变量

编辑:


__块存储修改器在这种情况下可能会有所帮助

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

最好确保以原子形式访问变量

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

如何使用quitRender变量

编辑:


将quitRender变量设置为块存储类变量是正确的,因为代码主体可以对其进行修改,以指示应取消挂起的操作

然而,正如其他人所建议的那样,使其线程安全并没有问题,因为取消从一开始就具有内在的竞争性。您可以在变量设置为TRUE之前立即开始执行块并执行取消检查,在这种情况下,即使您正在进行OSAtomic包装,您也会失去比赛,因此您最好将其设置并忘记,因为在这种情况下,取消标志只能从FALSE状态移动到TRUE状态


如果出于某种原因管理块类存储是一件痛苦的事情,比如说您有多个操作都可能是可取消的,那么将取消标志放在队列正在管理的任何数据结构中,然后简单地检查它。如果队列本身是指示队列上的所有操作都已取消的正确位置,则还可以使用dispatch_{set,get}u specific将其与队列本身一起存储。HTH.

将quitRender变量设置为块存储类变量是正确的,因为代码主体可以对其进行修改,以指示应取消挂起的操作

然而,正如其他人所建议的那样,使其线程安全并没有问题,因为取消从一开始就具有内在的竞争性。您可以在变量设置为TRUE之前立即开始执行块并执行取消检查,在这种情况下,即使您正在进行OSAtomic包装,您也会失去比赛,因此您最好将其设置并忘记,因为在这种情况下,取消标志只能从FALSE状态移动到TRUE状态


如果出于某种原因管理块类存储是一件痛苦的事情,比如说您有多个操作都可能是可取消的,那么将取消标志放在队列正在管理的任何数据结构中,然后简单地检查它。如果队列本身是指示队列上的所有操作都已取消的正确位置,则还可以使用dispatch_{set,get}u specific将其与队列本身一起存储。HTH.

你能把这段代码翻译成你所说的原子函数吗?我添加了一个原子函数的例子。哇!那太开放了!我想这是线程安全的,对吗?谢谢分享!你能把这段代码翻译成你所说的原子函数吗
添加了一个原子函数的示例。哇!那太开放了!我想这是线程安全的,对吗?谢谢分享!