2014-11-14 28 views
-1

我正在從服務器添加圖像。我正在使用NSMutableArray和自定義UITableViewCell。問題:當我運行該項目時。 UITableViewCell顯示相同的圖像。我覺得它讓人耳目一新。我該如何解決這個問題?在Dispatch_queue中的UITableView單元中獲取相同的圖像

下面分派方法我用過,

dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
     //this will start the image loading in bg 
     dispatch_async(concurrentQueue, ^{ 
      NSError *nserror = nil; 
      NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString: [imagesArray2 objectAtIndex:indexPath.row]]options:NSDataReadingUncached error:&nserror]; 

      //this will set the image when loading is finished 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       if (nserror) 
       { 
        [cell.imgview setImage:[UIImage imageNamed:@"placeholderimage.png"]]; 
       } 
       else 
       { 
        [cell.imgview setImage:[UIImage imageWithData:imageData]]; 
       } 
       [mytablview reloadData]; 
      }); 
     }); 

感謝您的幫助。

+1

爲什麼人們會這樣做?對於所有神聖的愛,請去使用AFNetworking(搜索GitHub)並使用'AFImageView'。它會爲你節省很多時間,麻煩和頭痛等等。 – 2014-11-14 12:42:51

+1

在圖像數據加載之前立即設置您的「佔位符圖像」。 – Astoria 2014-11-14 12:43:07

+4

@GuyKogus它可能是好奇心!或者一些任務要求。人們爲什麼要走直線路?它是編程 - 整個世界! – Astoria 2014-11-14 12:45:32

回答

1

重新加載新的圖像之前,重置單元格imageView。

[cell.imgview setImage:[UIImage imageNamed:@"placeholderimage.png"]]; 
    dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
     dispatch_async(concurrentQueue, ^{ 
      NSError *nserror = nil; 
      NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString: [imagesArray2 objectAtIndex:indexPath.row]]options:NSDataReadingUncached error:&nserror]; 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       if (nserror) { 
        [cell.imgview setImage:[UIImage imageNamed:@"placeholderimage.png"]]; 
       } else { 
        [cell.imgview setImage:[UIImage imageWithData:imageData]]; 
       } 
      }); 
     }); 
+0

它的工作原理,但當我嘗試滾動刷新每次。加載後我不想補充圖像。 – 2014-11-14 14:01:18

+0

這是另一個問題......你需要實現緩存機制,從緩存加載而不是每次都請求,你可以看看NSCache。 – l0gg3r 2014-11-14 14:02:56

1

這並沒有真正回答你的問題,但它可以幫助你改變你在前進的方向。

當你完成加載圖像時,細胞可能已經開始加載,因爲UITableView不同的圖像s重用他們的細胞。異步加載圖像並將其設置完成後的操作不會被取消,因此您將無法保證首先完成哪個圖像加載。

請參閱我對於AFNetworking的評論,我強烈建議您使用,但如果您選擇了不同的路徑,那麼您應該使用某種NSOperation子類來加載圖像。這樣,您可以在單元重新使用時取消操作,然後可以安全地爲該單元加載不同的圖像。

0

將網址保存在最終會顯示圖像的單元格中。然後,當您嘗試在圖像到達後顯示圖像時,請確保單元格中的網址與您嘗試顯示的圖像的網址相匹配。如果不匹配,請不要顯示;這意味着單元格已被重用(由於滾動或刷新),不再需要該圖像。無需停止加載圖像,只需顯示。

相關問題