UIImage продолжает загружаться все время, когда скролл даже хранится в NSCache - swift

Я новичок в программировании iOS. Я создаю простое приложение, которое загружает изображение по определенной ссылке (firestore). Изображения полностью загружены с сервера и видны в каждой ячейке collectionview по-прежнему. Но проблема в том, что когда я прокручиваю вверх или вниз, эти изображения снова загружаются. Я думаю, что он начинает загружаться снова, потому что, когда я отключаю интернет-соединение, эти изображения больше не загружаются.

Вот как я устанавливаю изображения в каждой ячейке

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! CollectionCell

    let explore = dataAppend[indexPath.item]
    //cell.imageDisplay.text = explore.title
    if let imageUrl = explore.image {
        cell.imageDisplay.loadImageWithData(urlString: imageUrl)
    }
    //print(explore.image)
    return cell
}

Вот как выглядит загрузка изображений loadImageWithData(urlString: imageUrl)

let imageCache = NSCache<NSString, UIImage>()

class CustomImageView : UIImageView {

var imageUrlString: String?

func loadImageWithData (urlString: String) {

    imageUrlString = urlString
    if let imageFromCache = imageCache.object(forKey: urlString as NSString){
        self.image = imageFromCache
    }
    image = nil
    let url = URL(string: urlString)
    URLSession.shared.dataTask(with: url!, completionHandler: { (data, response, error) in

        if let err = error {
            print(err.localizedDescription)
        }
        if let data = data {

            DispatchQueue.main.async {
                let imageToCache = UIImage(data: data)
                if self.imageUrlString == urlString {
                    self.image = imageToCache
                }
                imageCache.setObject(imageToCache!, forKey: urlString as NSString)
            }
        }
    }).resume()
}
}

2 ответа

 var imageCache = NSMutableDictionary()

class CustomImageView: UIImageView {

func loadImageUsingCacheWithUrlString(urlString: String) {

    self.image = nil

    if let img = imageCache.valueForKey(urlString) as? UIImage{
        self.image = img
         return 
    }
        let session = NSURLSession.sharedSession()
        let task = session.dataTaskWithURL(NSURL(string: urlString)!, completionHandler: { (data, response, error) -> Void in

            if(error == nil){

                if let img = UIImage(data: data!) {
                    imageCache.setValue(img, forKey: urlString)    // Image saved for cache
                    DispatchQuee.main.asyn{
                       self.image = img

                }


            }
        })
        task.resume()
    }
}

}

Вместо этого вы можете использовать библиотеку Kingfisher, которая сама обрабатывает изображения, и вам не нужно об этом беспокоиться. Для реализации см.: https://github.com/onevcat/Kingfisher

с помощью только одной строки кода вы можете установить изображение

imgView.kf.setImage(with: ImageResource(downloadURL: URL(string: imgUrl)!))
Другие вопросы по тегам