2012-08-05 52 views
0

我想弄清楚這段代碼是否正在更新主線程上的UI。此代碼位於專門用於下載JSON供稿的類中。獲取數據後,我解析它以返回一個數組,我將用它來更新UI,然後讓委託人知道數據已準備就緒。我的委託人,一個視圖控制器,將使用這個數組來更新用戶界面。我是否需要在dispatch_get_main_queue塊中執行-parser:didFinishParsingWithResults:?或者是沒有必要,因爲我更新視圖控制器類中的用戶界面,而不是這個類?謝謝!GCD和代理線程?

__block NSArray *results; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    NSData *responseData = [NSData dataWithContentsOfURL:url]; 
    results = [self parseData:responseData]; 
    [self.delegate parser:self didFinishParsingWithResults:results]; 
}); 

回答

3
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 

這不是主線程。這是默認的優先級全局隊列,可能是任何線程。

如果parser:didFinishParsingWithResults:在沒有調度到主隊列/線程的情況下廢除了UI元素,那麼您遇到了問題。

+0

Got it!我只是不確定是否告訴代表意味着它會自動返回主線程。不知道我爲什麼做出這樣的假設。謝謝。 – 2012-08-05 05:45:04

2

絕對使用dispatch_get_main_queue()更新您的用戶界面,該代碼不是線程安全的,因此您總是希望在主線程上更新您的用戶界面。我很難學會這一點:-)