当前位置: 首页 > 面试题库 >

首次加载时,NSCache不适用于所有图像

颜骁
2023-03-14
问题内容

我正在swift
3.0中的一个项目中醒来,在该项目中,我使用NSCache将服务器的响应缓存在UITableView中,从而缓存了这些响应。但是由于某种原因,当我第一次加载该应用程序时,我只会看到很少的图像加载,但是如果我滚动并返回时,我会看到所有内容(从服务器检索响应结束时,我也重新加载了tableview,但是似乎并非如此)。我不确定我到底在这里缺少什么,下面的html" target="_blank">代码展示了我如何缓存图像。

let imageCache = NSCache<AnyObject, AnyObject>()
var imageURLString : String?

extension UIImageView {


    public func imageFromServerURL(urlString: String) {
        imageURLString = urlString

        if let url = URL(string: urlString) {

            image = nil


            if let imageFromCache = imageCache.object(forKey: urlString as AnyObject) as? UIImage {

                self.image = imageFromCache

                return
            }

            URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in

                if error != nil{
                    print(error as Any)


                    return
                }

                DispatchQueue.main.async(execute: {

                    if let imgaeToCache = UIImage(data: data!){

                        if imageURLString == urlString {
                            self.image = imgaeToCache
                        }

                        imageCache.setObject(imgaeToCache, forKey: urlString as AnyObject)// calls when scrolling
                    }
                })
            }) .resume()
        }
    }
}

问题答案:

在这里下载图像并将其存储在缓存中就可以了。问题在于更新tableview单元格。

当表格视图将单元格加载到表格上时,图像尚未下载。但是,一旦下载了图像,我们就必须有选择地更新单元格,以便立即显示图像。

由于正在滚动,因此表视图再次调用“ cellForRowatIndexpath”,这将更新滚动时显示已下载图像的单元格。

如果您仍然希望使用扩展名,建议您添加tableView和indexpath作为参数,以便我们可以调用重新加载特定行并立即更新视图。

我已经更新了表重载代码和扩展中定义的函数的结构。让我知道事情的后续。

let imageCache = NSCache<AnyObject, AnyObject>()
var imageURLString : String?

extension UIImageView {


public func imageFromServerURL(urlString: String, tableView : UITableView, indexpath : IndexPath)) {
    imageURLString = urlString

    if let url = URL(string: urlString) {

        image = nil


        if let imageFromCache = imageCache.object(forKey: urlString as AnyObject) as? UIImage {

            self.image = imageFromCache

            return
        }

        URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in

            if error != nil{
                print(error as Any)


                return
            }

            DispatchQueue.main.async(execute: {

                if let imgaeToCache = UIImage(data: data!){

                    if imageURLString == urlString {
                        self.image = imgaeToCache
                    }

                    imageCache.setObject(imgaeToCache, forKey: urlString as AnyObject)// calls when scrolling

    tableView.reloadRows(at: [indexpath], with: .automatic)

                }
            })
        }) .resume()
    }
}


 类似资料:
  • 我似乎不能为我的生活得到任何图像懒惰加载插件在wordpress工作。我尝试了懒负载,wp懒负载和bj懒负载。网站上的图像似乎没有一个是“懒惰加载”的。我也使用审计工具(chrome审计)测试了这个。当我删除图像(每页大约有50张图像)时,我的审计绩效和其他分数为99。当我加载图像(使用wordpress循环),我的性能下降到64. 我尝试了每一个延迟加载插件,但它们似乎都不是延迟加载。我正在本地

  • 问题内容: ember new foo-proj cd foo-proj ember s 现在服务器正在运行。但是,当我编辑文件时,例如foo-proj / app / index.html live-reload不会重新加载 ! 我在跑: 节点v0.10.31 npm 1.4.23 我一直在#ember-cli频道问问题,但是没有运气。我似乎是唯一遇到此问题的人。 问题答案: 终于 开始进行实时

  • 问题内容: 我想要一个jQuery进度栏,该进度栏会根据服务器端请求的状态进行更新。我基于本教程编写此代码,但它使用文件上传器作为基础(与此问题相同)。没有文件上传器,我无法使其工作完全相同。问题是进度条仅在process.php完成后才更新。它等待整个过程完成,而不是异步请求进度更新。我只看到数据:数据警报一次。 有任何想法吗? 网页: Process.php-提交表单时调用 javascrip

  • 我正在使用Facebook共享对话框共享特定的url。共享链接包含一个映像,该映像应该是稍后共享的一部分。奇怪的是,它在移动浏览器上完全可以正常工作。但是桌面浏览器不会在第一次尝试时加载图像。只需重新加载共享窗口即可修复丢失的图像。一旦此图像显示至少一次,它将在其他浏览器中继续工作,而无需重新加载。。 所以我的问题是:有人知道为什么这个网址的第一次调用不显示图像吗? 详细资料 用于打开共享对话框的

  • 我有一个C程序,通过响应信号来运行。一些信号导致父级分叉。这允许在父级继续响应信号的同时进行其他处理。 当父母被发送SIGTERM时,我希望分叉的孩子也收到一个SIGTERM。在父级退出之前,子级完成处理 SIGTERM 并不重要。 但是,使用下面的代码,当我从父代调用< code>kill(0,SIGTERM)时,子代没有收到SIGTERM。从< code>kill联机帮助页来看,似乎所有的孩子