0

我正在學習Objective-C,並試圖更好地理解GCD。我創建了一個可以進行API調用的對象(APICaller),然後向其代理提供信息。在此對象的代理(TableViewControllerAviewDidLoad方法中,我調用APICaller的方法之一,然後使用該信息更新兩個靜態單元的detailTextLabel.text。我的問題:爲什麼當我使用dispatch_async時,detailTextLabel.text的更新速度比沒有更快?爲什麼GCD使這段代碼正常工作?

這將更新細胞,但有一個較長時間的延遲:

- (void)viewDidLoad 
{ 
    APICaller *apiCaller = [APICaller alloc] init]; 

    [apiCaller getInformationWithArgument:self.argument completionHandler:^(NSString *results, NSError *error) { 
    _staticCell.detailTextLabel.text = results; 
    } 

} 

...而這將更新單元格瞬間:

- (void)viewDidLoad 
{ 
    APICaller *apiCaller = [APICaller alloc] init]; 

    [apiCaller getInformationWithArgument:self.argument completionHandler:^(NSString *results, NSError *error) { 
    dispatch_async(dispatch_get_main_queue, ^(void) { 
      _staticCell.detailTextLabel.text = results; 
     }); 
    } 

} 
+4

簡單。所有UI更新必須在主線程上完成,並且完成處理程序不在主線程上。 – rmaddy 2014-10-30 14:17:07

回答

1

在第一個代碼段中顯示的完成處理不在主線程上運行,因此只要系統決定需要更新就會得到更新。第二個片段使用GCD在主線程上顯式運行,因此會立即更新。

+0

啊。夠簡單。謝謝 – Ja5onHoffman 2014-10-30 14:35:10

相關問題