Swift 3:在 collectionView 中缓存图像

2024-03-20

我目前正在开发我的应用程序,将其更新为与 Swift 3 兼容,但还剩下一个问题。以前,我的图像缓存工作得很好,但自从更新后UIImageView获取图像时不会填充 s。

这是代码(在...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来了解发生了什么事。当视图加载时,我可以看到缓存未命中,以及图像加载和UIImageViews 被填充为可见行,但是当我向下滚动时,UIImageViews 从未被填充,日志显示CELL NOT FOUND: [0, x]对于每个索引路径。

如果我在向下滚动后再次向上滚动,图像将从缓存中按预期填充。

自 Swift / iOS / Xcode 的上一个版本以来,代码没有改变,并且曾经完美地工作。

我对任何第三方扩展等不感兴趣;我想了解上面的代码有什么问题。不过,欢迎对代码进行任何其他改进/建议。

任何想法将不胜感激!


而不是通过获取细胞cellForItem(at: indexPath)方法,只需使用cell用于设置缓存命中中的图像的变量。这将为单元格的图像视图创建一个强引用。

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

考虑重命名您的UIImageView to imageView而不是image.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 3:在 collectionView 中缓存图像 的相关文章

随机推荐

  • 如何使 MapView 对象透明(alpha)?

    All 我需要在 MapView 对象上显示信息 那里没有问题 问题是 有时 MapView 对象显示的地图详细信息在视觉上与我的叠加数据相竞争 因此 我想做的是提供一种通过使用 alpha 通道在视觉上 缩小 MapView 对象的方法
  • 如何自动检测用户的时区?

    您好 我正在创建一个网络应用程序 如果用户注册 我们将显示创建日期 为此 我们在我的sql表中使用当前时间戳 它显示服务器时间 但我们不知道如何根据用户时区转换时间 因为我们不是获取用户所在国家 地区 任何人都可以帮我解决它吗 提前致谢 使
  • “return 0”和“exit (0)”之间的区别[重复]

    这个问题在这里已经有答案了 有什么区别吗return 0 and exit 0 在函数中使用时 如果是 我应该什么时候使用return 0 or exit 0 在一个函数中 return退出该函数 同时exit退出程序 In main函数执
  • backbone.js 收集事件

    我开发了一个 jquery 和backbone js 网络应用程序 一个组件有一个 html 表 该表后面是一个backbone js 集合 该集合中的任何更改都会导致 html 表的更新 所以我写 this collection bind
  • UITableView重新加载数据

    我正在为 iPhone 制作一个基于导航的应用程序 我的视图控制器之一如下所示 interface NewComputerViewController UIViewController
  • 什么时候会使用 BRICK 权限?

    在Android中 曾经有一个名为BRICK http developer android com reference android Manifest permission html BRICK可用于潜在地禁用该设备 除了将其视为都市神话
  • 除 None 之外的任何类型的 Mypy 注释[重复]

    这个问题在这里已经有答案了 我怎样才能注释一个类型 除了None 换句话说 这个类型是Any但不是None 你可以做Union int str 但排除None来自那个工会
  • Scala Futures 如何与 flatMap 链接在一起?

    我正在 Scala 中首次使用 Futures 并且正在研究使用 flatMap 组合器的示例 我一直在关注这个讨论 http docs scala lang org overviews core futures html http doc
  • 当构建系统已引用 System.Core 时,添加对 System.Core 的引用

    即使项目已生成 Visual Studio Intellisense 也无法识别动态关键字 我尝试添加对System Core来解决问题 我收到此错误 无法添加对 System Core 的引用 该组件是 已经被构建系统自动引用 我注意到我
  • 从 Eclipse 和命令行运行时,BufferedImage 字节具有不同的字节顺序

    我试图转换一个BufferedImage s byte 从 32 位 RGBA 到 24 位 RGB 根据这个答案 https stackoverflow com a 9470843 2581401最快的方式获得byte 从图像中可以看出
  • AWS - 对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头

    我对 AWS 还很陌生 所以请耐心等待 我目前正在制作一个具有上传照片功能的网络应用程序 我想将这些照片保存在 S3 存储桶中 并将对它们的引用保存在我的数据库中 我目前正在遵循本指南 http docs aws amazon com sd
  • 生成所有可能的字符串组合

    我正在尝试生成字符串的所有可能组合 例如对于以下列表 a1q5z H9 b1q5z H9 c1q5z H9 d1q5z H9 a2q5z H9 等 我不想做很多嵌套循环 而是想用 MODULO 尝试一些聪明的东西 但碰壁了 这是我想出的 J
  • NHibernate Session.SetReadOnly

    我面临着其他人已经在 SO 上发布的同样问题 在从数据库读取对象时 NHibernate 会更新所有对象 因为数据库中一个字段的值不正确 详细来说 新添加的日期列在所有行中都包含 1 1 0001 因此在映射时 NHibernate 会替换
  • jQuery URL 分割和抓取

    所以我有一个 URL 并且我知道如何从 URL 获取 GET 但我的 URL 是http www example com edit 2695 有没有办法抓取网址并在之后吐出部分 我想要编辑和 ID 您可以使用此代码 var url http
  • Django 时间问题

    我在 django 中的应用程序需要告诉用户操作发生的时间 除了询问用户他 她所在的时区之外 我是否可以在客户端生成时间 在我的脑海中 是否有一个与时区无关的时间的特定表示 unix时间 然后我可以简单地将其粘贴到html中并让客户端 浏览
  • 如何为该月中的几天提供后缀?

    我需要一个函数在显示 等文本时返回几天的后缀th in Wednesday June 5th 2008 它只需要处理数字 1 到 31 不需要错误检查 和英语 这是一个也适用于更大数字的替代方案 static const char dayS
  • R - 从 URL/HTML 对象/HTML 响应写入 HTML 文件

    我想使用 R 中的 URL 保存 HTML 文件 我尝试在使用后保存响应对象GET and read html的功能httr and rvest分别打包到网站的 URL 上 我想保存 的 HTML 但这并不能保存网站的实际内容 url ht
  • 带有 async/await 的 try/catch 块

    我正在深入研究节点 7async await功能并不断绊倒这样的代码 function getQuote let quote Lorem ipsum dolor sit amet consectetur adipiscing elit la
  • 是否有获取最新 Microsoft Edge 版本号的链接?

    我正在寻找一个链接来获取 Microsoft Edge 的最新驱动程序版本号 类似于 Google Chrome 的链接 https chromedriver storage googleapis com LATEST RELEASE ht
  • Swift 3:在 collectionView 中缓存图像

    我目前正在开发我的应用程序 将其更新为与 Swift 3 兼容 但还剩下一个问题 以前 我的图像缓存工作得很好 但自从更新后UIImageView获取图像时不会填充 s 这是代码 在 cellForItemAt 功能 if let img