2013-09-22 33 views
1

基本上下面的代碼的工作原理如下,當我按下按鈕時,它會導致兩個標籤在4秒內同時更新其受尊重的文本。然而,如果我註釋掉dispatch_async(dispatch_get_main_queue(),^(void){我的標籤仍然更新,但它將採用第一個標籤4秒,然後第二個標籤在第一個標籤後4秒更新,我想知道是否有人可以解釋爲什麼這兩個標籤更新在4秒與調度代碼在一個愚蠢的事情倒可以這麼說。我試着聽聽教程說明,但它只是讓我感到困惑,甚至更多。Objective -c:在下面的代碼中需要一些關於dispatch_async(GCD)的說明

void (^tFunct1)(UILabel *,NSString*) = ^(UILabel *lbl, NSString *src){ 
NSLog(@"GO TO SLEEP..."); 
sleep(4); 
NSLog(@"WAKING UP..."); 
dispatch_async(dispatch_get_main_queue(), ^(void){ 
[lbl setText:src]; 
NSLog(@"Label Done!"); 
}); 

}; 
-(IBAction)buttonPressed:(id)sender{ 
aConCurrentQue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0); 
dispatch_async(aConCurrentQue ,^{ tFunct1(self ->lblOne, @"1 GO!"); }); 
dispatch_async(aConCurrentQue ,^{ tFunct1(self ->lblTwo, @"2 GO!"); }); 
} 
+0

似乎很奇怪使用塊來調用塊內的塊。只需使用一種方法。此外,使用' - >'來訪問ivars可行,但不是標準約定。只需直接使用他們。 – bbum

回答

0

你總是必須做的UI更新主隊列通過註釋調度到主隊列,你試圖在後臺全局隊列上進行UI更新,這就解釋了不正確的行爲

UIKit沒有設計(有一些非常特殊的ic異常)在後臺隊列上工作,並且您不應該更新後臺隊列上的UI。

+0

酷,也只是爲了明確調度主闕主要由多線程處理器那樣處理,正確嗎?對不起,如果我以任何方式聽起來無知。一直試圖抓住這個問題。 –

+0

@SquidwardTennisballs主隊列是一個特殊的串行隊列,用於執行應用主線程中的任務。請參閱[關於調度隊列](https://developer.apple.com/library/ios/DOCUMENTATION/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW2)因爲主隊列對於及時的UI更新非常重要,這就是爲什麼我們派遣任何緩慢的任務到後臺隊列,不要阻塞這個主隊列。但是,就像我們上面所說的那樣,UI更新必須在這個主隊列上進行。 – Rob

+0

酷,所以使用後臺隊列來下載或解析通常需要永久存儲的圖像。 –