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)!))