我的应用程序从Imgur下载高分辨率图像时的滚动性能很慢.奇怪的是,图像正在出列和渲染.下面是下载图像的代码.我认为缓存机制不起作用.我该怎么解决这个问题?

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "PhotoTableViewCell", for: indexPath) as! PhotoTableViewCell
        cell.descrpiptionLabel.text = photos[indexPath.row].title ?? "No Description"
        cell.photoImageView.downloadImage(from: images[indexPath.row])
        return cell
    }
    let imageCache = NSCache<NSString,AnyObject>()
    
    extension UIImageView {
        
        func downloadImage(from urlString: String ) {
            guard let url = URL(string: urlString) else { return }
            storeCache(url: url)
        }
        
        func storeCache(url:URL){
            if let cachedImage = imageCache.object(forKey: url.absoluteString as NSString) as? UIImage {
                self.image = cachedImage
            }else {
                let _: Void = URLSession.shared.dataTask(with: url) { [weak self] data, response, error in
                    
                    guard let self = self else { return }
                    
    
                    if error != nil { return }
                    DispatchQueue.main.async {
                        if let downloadedImage = UIImage(data: data!) {
                            imageCache.setObject(downloadedImage, forKey: url.absoluteString as NSString)
                            self.image = downloadedImage
                        }
                    }
                }.resume()
            }
        }
        
    }

推荐答案

  1. 对于重复使用单元格时显示上一个图像的问题,应在PhotoTableViewCell中覆盖func prepareForReuse(),并设置photoImageView.image = nil.
  2. 对于您的性能问题,看起来您正在从主线程发出API请求,所以这是一个很好的开始.您请求的图像有多大?我想知道数据是否太大,以至于将其转换为图像然后在图像视图上设置图像需要花费大量时间

Ios相关问答推荐

SwiftUI绑定到特定的一个或多个枚举 case

Xcode -Google Mobile Ads SDK在没有AppMeasurement的情况下初始化

带有故事板的Xcode 15 UIKit视图可以与#Preview宏一起使用吗?

JSON响应中的键有时为Int,有时为字符串

Apple Metal iOS 为什么 GLKMatrix4MakeLookAt 来回摇摆

react 本机 |错误:无法解析 node_modules/react-native/index.js 中的模块

更新 flutter 和 xcode 后 Xcode 14.3 中缺少文件 (libarclite_iphoneos.a)

ITMS-90725 无用的错误信息,因为它自相矛盾,苹果上传

Task.cancel() 的 TaskPriority 的区别

一对多关系 Firebase 实时数据库(嵌入数百万条 comments )

如何在 SwiftUI 中只显示一次随机数组的项目?

SwiftUI Select 器值在超过最大值时重置

警告:iPad:Icon-72.png:图标尺寸(0 x 0)

界面生成器 - 无法从路径加载设计对象(空)

如何在 Swift 中使用包含多个值的查询参数构建一个 URL?

正确的领域使用模式/最佳实践?

应用程序不包含正确的测试版权利

命令 /Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang 失败,退出代码为 1

Select 器touchesBegan:withEvent:的覆盖方法具有不兼容的类型(NSSet,UIEvent)->()

AFNetworking 2.0 向 GET 请求添加标头