2017-07-15 55 views
1

我有一個集合視圖,需要顯示其文件保存在設備上的圖像集合。它們都是600x600像素,所以我認爲最好在後臺線程上異步創建UIImage,然後在主線程上設置我的UIImageViewimage屬性。下面是我在一段時間image做到這一點凡在我(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath方法UICollectionViewCell使用GCD從設備加載異步圖像

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 

     NSString *imageName = [NSString stringWithFormat:@"wo-%@", template.fileName]; 

     UIImage *image = [UIImage imageNamed:imageName]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      if (image == nil) 
      { 
       self.collectionView.backgroundColor = [UIColor redColor]; 
       NSLog(@"image named: %@ in nil!", imageName); 
      } 
      cell.imageView.image = image; 
     }); 
    }); 

    return cell; 

每隔一段時間就會nil的細胞之一。它不可重現,並不總是相同的單元/圖像名稱。我想知道這與使用UIImage imageNamed:方法有什麼關係,或者我錯誤地使用了GCD?任何關於這個問題的想法將不勝感激。

+0

使用imageNamed意味着圖像隨您的應用程序的包。直接加載這些應該有非常低的延遲(甚至在第一次加載之後更低,因爲它們將被UIImage緩存)。您可以/也應該考慮運送較小版本的圖像,並針對該設備進行優化。跳過gcd代碼,只需調用imageNamed: – danh

回答

0

對於異步加載圖像,「SDWebImage」可能是最佳解決方案。

SDWebImage

只是叫你cellForItemAtIndexPath下面的方法:

[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.example.com/path/to/image.jpg"] 
     placeholderImage:[UIImage imageNamed:@"placeholder.png"]];