Swift 3: almacenamiento en caching de imágenes en una colecciónView

Actualmente estoy trabajando en mi aplicación, actualizándola para trabajar con Swift 3 y tengo un problema. Anteriormente, mi caching de imágenes funcionaba muy bien, pero desde la actualización, los UIImageView s no se rellenan cuando se UIImageView la image.

Aquí está el código (en la function ...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() } 

Como puede ver, he agregado algunas print para averiguar qué está sucediendo. Cuando se carga la vista, puedo ver fallas de caching y las imágenes UIImageView y la UIImageView s se llena para las filas visibles; sin embargo, cuando me UIImageView hacia abajo, UIImageView s nunca se llena y el logging muestra CELL NOT FOUND: [0, x] para cada ruta de índice.

Si vuelvo a upload de nuevo después de desplazarme hacia abajo, las imágenes se rellenan desde el caching como se esperaba.

El código no ha cambiado desde la versión anterior de Swift / iOS / Xcode, y solía funcionar perfectamente.

No me interesan las extensiones de terceros, etc. Quiero entender qué ocurre con el código anterior. Sin embargo, cualquier otra mejora / sugerencia al código es bienvenida.

¡Cualquier idea sería muy apreciada!

En lugar de get la celda a través del cellForItem(at: indexPath) , simplemente use la variable de cell que usa para configurar la image en el hit del caching. Esto creará una fuerte reference a la vista de la image de la celda.

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

Considere cambiar el nombre de su UIImageView a imageView lugar de la image .