2017-07-15 21 views
1

私は、ファイルがデバイスに保存されているイメージのコレクションを表示する必要があるコレクションビューを持っています。それらはすべて600x600ピクセルですので、バックグラウンドスレッドで非同期にUIImageを作成し、imageのプロパティをメインスレッドのUIImageViewに設定する方が良いと思いました。私は細胞のいずれかのnilされるが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; 

すべてでこれを行う場合についてです。再現性がなく、必ずしも同じセル/イメージ名であるとは限りません。私はこれがUIImage imageNamed:メソッドを使うことと何か関係があるのか​​、GCDを間違って使っているのだろうかと思いましたか?問題に関するあらゆる考えが評価されるだろう。

+0

は、画像が、アプリケーションのバンドルに同梱されていることを意味します。それらを直接ロードするだけで待ち時間は非常に短くなければなりません(UIImageによってキャッシュされるので、最初のロード後もさらに低くなります)。あなたはまた、デバイスのために最適化されたより小さなバージョンのイメージを発送することを検討することもできます。 gcdコードをスキップし、単にimageNamedを呼び出します: – danh

答えて

0

画像を非同期にロードするために、「SDWebImage」が最適なソリューションです。

SDWebImage

ちょうどあなたcellForItemAtIndexPathに次のメソッドを呼び出します。imageNamedを使用して

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