2013-06-19 45 views
0

我做了一個功能,將循環通過圖像(1.png,2.png,3.png,4.png,5.png)並顯示它們到UIImageView。這個想法是,我正在加載一個網頁,我希望這個圖像視圖運行通過這個功能,基本上作爲一個加載圖標。然而,我不明白爲什麼它不工作,據imageview去,我什麼都沒看到。請幫忙!我的功能代碼如下。我知道這是錯誤的,我在這裏做,因爲我測試的一切,包括webview委託工作得很好。爲什麼我的ImageView沒有做任何事情,至少重繪?

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    for(int c = 1; !webviewLoaded; c++) 
    { 
     c = c % 6; 
     if(c == 6) 
      c = 1; 
     NSString *numberString = [NSString stringWithFormat:@"%d.png", c]; 
     UIImage *img = [UIImage imageNamed:numberString]; 
     [self.loadingImage setImage:img]; 
     sleep(1); 
    } 
}); 
+0

你應該閱讀的UIImageView的文檔。它擁有內置的動畫 –

回答

0

因爲你是在後臺線程上做UI的東西,你不應該改變後臺線程的UI組件。

你可以改變你的代碼如下:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
    for(int c = 1; !webviewLoaded; c++) 
    { 
     c = c % 6; 
     if(c == 6) 
      c = 1; 
     NSString *numberString = [NSString stringWithFormat:@"%d.png", c]; 
     UIImage *img = [UIImage imageNamed:numberString]; 
     [self.loadingImage setImage:img]; 
     sleep(1); 
    } 
    } 
}); 

這段代碼的工作,但就是那種無用的,它會給你會期待,因爲你在做什麼,你的結果不是很好是創建一個單獨的線程(操作),只是從它調用UI線程,這是不高效的。

你應該做的是完全去除派遣這樣的:

for(int c = 1; !webviewLoaded; c++) 
    { 
      c = c % 6; 
      if(c == 6) 
       c = 1; 
      NSString *numberString = [NSString stringWithFormat:@"%d.png", c]; 
      UIImage *img = [UIImage imageNamed:numberString]; 
      [self.loadingImage setImage:img]; 
      sleep(1); 
    } 

這也將工作,但要確保你有這些文件@"%d.png添加到您的項目。

因爲你不熟悉GCD這裏是一個good tutorial

+0

@MarcusAdams是的,他可以,但他發佈了一段代碼,我不知道他是如何使用它的,所以我發佈了一個解決方案,但是我認爲他正在嘗試(只需從項目加載一些圖像),不需要任何「調度」,因爲沒有對圖像或其他計算進行大量處理,這就是爲什麼我添加了第二塊代碼的原因;) – danypata

+0

感謝您的幫助和你的資源。僅供參考,您的建議只是部分解決方案。爲了使它工作,你需要把第二塊塊放在只是變化的用戶界面上,我仍然欣賞你花時間 – srz2

+0

很高興我可以幫忙;) – danypata

相關問題