2014-04-22 47 views
0

我使用GCD從服務器下載圖像並更新UILabel上的處理,然後將標籤打印到屏幕上(例如:將打印到屏幕上:「下載:3/15圖片「)如何在IOS下使用GCD下載圖像時更新標籤文本

但是在開始時標籤是:」下載:0/15圖像「。然後當它完成下載時,標籤是「下載:15/15圖像」。用戶不能看到下載處理。

我想要的是用戶可以看到如下處理: 「下載:1/15圖像」,「下載:2/15圖像」。「下載:3/15圖像」,...,「下載: 15/15圖像「。

這是我的代碼:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     //Here your non-main thread. 
     NSString *text; 

     for (int i = 0;i<[self.pageImages count];i++){ 
      NSString *image = [self.pageImages objectAtIndex:i]; 

      [dataManage downloadImagesFromUrl: image ]; 
      text = [NSString stringWithFormat:@「Downloading %d/%d」,i,self.pageImages.count]; 
     } 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      //Here you returns to main thread. 
      [downloadLabel setText:text]; 
     }); 
    }); 
+3

你必須寫循環內的代碼的setText。 – borncrazy

+0

我在循環中設置文本,但它只是打印:「」下載:1/15圖像「,沒有別的。我讀他們提到,我們必須更新主線程中的用戶界面,但是當我NSlog」文本「它將打印出我想要的結果 – tommy

+0

我遇到了幾乎完全相同的問題,我最終做的是不使用「for」循環,而是使用NSTimer,並將事件間隔爲0.5秒。更新顯示在您的標籤 –

回答

2

移動

dispatch_async(dispatch_get_main_queue(), ^{ 
    //Here you returns to main thread. 
    [downloadLabel setText:text]; 
}); 

for循環內部,使得UI是每個下載(而不是僅在所有迭代結束)後更新。

+0

我在循環內設置文本,但它只是打印:「」下載:1/15圖像「,沒有別的。我在某處讀到他們提到我們必須在主線程中更新UI。但是當我NSlog的「文本」它會打印我想要的。 – tommy

+0

@tommy因爲在運行循環時可能只有一個頁面圖像就緒。當你從這裏的某個地方得到一個下載電話時,你應該更新標籤'[dataManage downloadImagesFromUrl:image];'。 – Desdenova

+0

使用'dispatch_async(dispatch_get_main_queue ...「)應該意味着你不需要一個定時器,因爲它將UI更新推送到主隊列(並遠離for循環)。你確實將整個代碼塊移入循環中,是的? – Wain

1

試試這個代碼dispatch_async塊中:

[[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
    [downloadLabel setText:text]; 
}]; 
+0

這是將某些東西放到主線程隊列中的一種不同方式,但它不能解決問題因爲它仍然在錯誤的時間添加到隊列中(太遲) – Wain

相關問題