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

问题描述:

我有一个块,我提交给一个队列,我只希望块执行,如果一定条件为真。它看起来有点像这样:如何在代码块中通过引用使用变量?

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

这里的问题是,如果喜更改块的块之后没有外援的价值已经被提交到队列中,但它已运行前, 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; 
}); 

而且,无论是那些似乎工作。

__block BOOL hi应该做些什么来解除引用你要。请注意,如果您正在异步调度,那么在将hi更改为NO之前,有可能会运行if (hi == YES),即使该块的其余部分不是。你真正应该做的是定期检查你是否应该继续工作,而不是检查一次,看看你是否应该开始。

+0

马丁是正确的,如果你运行这个,它会像预期的那样工作,所以__block指令将只是对它的引用。 BOOL b = YES; \t空隙(^块)()= [[^ { \t \t如果(B == YES){ \t \t \t的NSLog(@ “B == YES”);其他{ \t \t}其他{ \t \t \t NSLog(@“b == NO”); \t \t} \t} copy] autorelease]; \t b = NO; \t block(); – Mattia

我不是块专家,所以我不知道是否有办法不捕获一个原始变量的值(但我认为没有)。想到的解决方案是使用指针或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; 
});