2011-07-19 36 views
2

我得到這個代碼問題的GCD和本地UI刷新

-(void)changeText 
{ 

    dispatch_queue_t gqueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); 

    dispatch_async(gqueue, ^(void){ 
    //simulate a network traffic delay 
    [NSThread sleepForTimeInterval:5]; 
    NSLog(@"start executing"); 
    self.mylabel.text = @"Yeah! Text Changed"; 
    NSLog(@"stop exec"); 
    }); 
} 

問題是,它需要太多的時間來改變標籤文本比通常做。如果我使用主隊列,它會做瞬間,但用戶界面將會被阻塞,持續5秒。

什麼是使用GCD,這樣我可以在另一個線程下載的東西,我的UI不會被阻塞,並儘快完成我的工作,我的UI將會立即更改的正確方法?

回答

5

你不能在後臺線程修改UIKit的對象(如UILabel)。以上應該是:

-(void)changeText 
{ 

    dispatch_queue_t gqueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); 

    dispatch_async(gqueue, ^(void){ 
    //simulate a network traffic delay 
    [NSThread sleepForTimeInterval:5]; 
    NSLog(@"start executing"); 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     self.mylabel.text = @"Yeah! Text Changed"; }); 
    NSLog(@"stop exec"); 
    }); 
} 

您還可以使用dispatch_sync而不是display_async等待主線程處理的變化,但要小心的僵局。