46

在我的dispach_async代碼block我無法訪問global variables。我得到這個錯誤Variable is not Assignable (missing _block type specifier)無法訪問dispatch_async中的全局變量:「變量不可分配(缺少_block類型說明符)」

NSString *textString; 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 
    (unsigned long)NULL), ^(void) { 
     textString = [self getTextString]; 
}); 

任何人都可以幫我找出原因嗎?

+0

而這與Xcode無關。 – 2013-09-20 18:37:10

回答

135

您必須使用__block符在修改塊中的變量,所以你給的代碼應該是這樣的,而不是:

__block NSString *textString; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 
               (unsigned long)NULL), ^(void) { 
     textString = [self getTextString]; 
}); 

塊捕捉他們的身體內引用變量的狀態,所以捕獲的變量必須聲明爲可變的。考慮到你基本上設置了這個東西,可變性正是你需要的。

+17

請注意''__block'中有** **兩個下劃線** –

+0

但是這個解決方案仍然是無用的 - 塊被異步執行一次。所以即使它可以分配給本地變量'testString',誰可以使用它呢?我能想到的唯一的事情是,如果這個範圍中有另一個塊也使用'textString',它可以在以後執行。 – newacct

+0

沒有周圍的環境,或者基本上不是僞代碼的代碼,你是如何做出這種決定的?對於您所知道的,OP可能會忽略dispatch_group邏輯,或者可能會忽略塊中的某些周圍的KVO'will/didChangeValueForKey:'調用。要點是:你錯過了這個問題的要點。 – CodaFi