2016-09-18 15 views
3

私は現在、Swift 3で動作するようにアップデートしています。以前は画像キャッシュがうまく機能していましたが、画像が取り込まれたときに更新のUIImageViewが読み込まれていないためです。ここでSwift 3:コレクションビューで画像をキャッシュする

は(...cellForItemAt...関数内の)コードです:

if let img = imageCache[imageUrl] { 
    print("CACHE HIT: \(indexPath)") 
    cell.image.image = img 
} else { 
    print("CACHE MISS: \(indexPath)") 
    var imgUrl: = URL(string: imageUrl) 
    let request: URLRequest = URLRequest(url: imgUrl!) 
    let dataTask = session.dataTask(with: request, completionHandler: { (data, response, error) -> Void in 
     if(data != nil) { 
      print("IMAGE DOWNLOADED: \(imgUrl?.query))") 
      let image = UIImage(data: data!) // create the image from the data 
      self.imageCache[imageUrl] = image // Store in the cache 
      DispatchQueue.main.async(execute: { 
       if let cell = collectionView.cellForItem(at: indexPath) as? MyCollectionViewCell { 
        print("APPLYING IMAGE TO CELL: \(indexPath)") 
        cell.image.image = image 
        self.collectionView.reloadData() 
       } else { 
        print("CELL NOT FOUND: \(indexPath)") 
       } 
      }) 
     } 
    }) 
    dataTask.resume() 
} 

あなたが見ることができるように、私は何が起こっているかを調べるために、いくつかのprint秒に追加しました。ビューがロードされると、キャッシュミスが発生する可能性があります。イメージのロードとUIImageViewが表示行に移入されますが、スクロールすると、UIImageViewは決して読み込まれず、ログにはそれぞれのindexPathに対してCELL NOT FOUND: [0, x]が表示されます。

スクロールダウンした後に再びスクロールすると、イメージは予想通りにキャッシュから取り込まれます。

コードはSwift/iOS/Xcodeの以前のバージョンから変更されておらず、完全に動作していました。

私はサードパーティの拡張機能などに興味がありません。上記のコードで何が間違っているのか理解したい。しかし、コードに対するその他の改善/提案は歓迎します。

アイデアは非常に高く評価されます。

答えて

2

cellForItem(at: indexPath)メソッドでセルを取得するのではなく、キャッシュヒットのイメージを設定するために使用する変数cellを使用します。これにより、セルのイメージビューへの強い参照が作成されます。

DispatchQueue.main.async(execute: { [weak collectionView] in 
    cell.image.image = image 
    collectionView?.reloadData() 
}) 

imageではなく、あなたのUIImageViewimageViewに名前を変更することを検討してください。

+0

ありがとうCallam、それは完璧に機能しました! ''弱い自己 ''はどのように役立つのですか? – Ben

+1

閉包で自己を参照すると、強い参照が作成され、時には問題が発生することがあります。したがって、 ''弱い自己 ''は静かに死ぬ弱い参照を作ります。 – Callam

+1

これをチェックしてくださいhttp://krakendev.io/blog/weak-and-unowned-references-in-swift – Callam

関連する問題