如何在代码块中通过引用使用变量?

时间:2011-08-01 20:51:45

标签: iphone ios multithreading xcode grand-central-dispatch

我有一个我提交给队列的块,我只希望在某个条件为真时执行该块。看起来有点像这样:

bool hi = YES;
dispatch_async(queue, ^{
    if (hi == YES)
        do stuff;
});

这个的问题在于,如果在块被提交到队列之后但在块运行之前,hi的值在块之外变为NO,则块内的hi值仍为YES。

我查看了文档并找到了__block指令,看起来它可能对我有帮助,但是没有用。我试过了:

__block bool hi = YES;
dispatch_async(queue, ^{
    if (hi == YES)
        do stuff;
});

bool hi = YES;
dispatch_async(queue, ^{
    __block boolean hi2 = hi;
    if (hi2 == YES)
        do stuff;
});

这些似乎都不起作用。

2 个答案:

答案 0 :(得分:2)

__block BOOL hi应该做你想做的事。请注意,如果您异步调度,则在将hi更改为NO之前可能会运行if (hi == YES),即使块的其余部分不是。你应该做的是定期检查你是否应该继续工作,而不是检查一下是否应该开始。

答案 1 :(得分:1)

我不是块的专家所以我不知道是否有办法不在一个内部捕获原始变量的值(但我认为没有)。但是,可以想到的解决方案是使用指针或NSNumber来解决问题。

<强>指针

/* this obviously needs to still be around to be dereferenced when the block executes */
BOOL hi = YES; 
BOOL* hiPtr = &hi;

dispatch_async(queue, ^{
    if (*hiPtr == YES)
        do stuff;
});

<强>的NSNumber

/ *当块执行* /

时,这显然需要被解除引用
__block NSNumber* hi = [NSNumber numberWithBool: YES]; 

dispatch_async(queue, ^{
    if ([hi boolValue] == YES)
        do stuff;
});