私は現在、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の以前のバージョンから変更されておらず、完全に動作していました。
私はサードパーティの拡張機能などに興味がありません。上記のコードで何が間違っているのか理解したい。しかし、コードに対するその他の改善/提案は歓迎します。
アイデアは非常に高く評価されます。
ありがとうCallam、それは完璧に機能しました! ''弱い自己 ''はどのように役立つのですか? – Ben
閉包で自己を参照すると、強い参照が作成され、時には問題が発生することがあります。したがって、 ''弱い自己 ''は静かに死ぬ弱い参照を作ります。 – Callam
これをチェックしてくださいhttp://krakendev.io/blog/weak-and-unowned-references-in-swift – Callam