如何在代码块中通过引用使用变量?
问题描述:
我有一个块,我提交给一个队列,我只希望块执行,如果一定条件为真。它看起来有点像这样:如何在代码块中通过引用使用变量?
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)
,即使该块的其余部分不是。你真正应该做的是定期检查你是否应该继续工作,而不是检查一次,看看你是否应该开始。
答
我不是块专家,所以我不知道是否有办法不捕获一个原始变量的值(但我认为没有)。想到的解决方案是使用指针或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;
});
马丁是正确的,如果你运行这个,它会像预期的那样工作,所以__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