【问题标题】:How to cache the image in swift using SDWebImage?如何使用 SDWebImage 快速缓存图像?
【发布时间】:2023-04-03 04:50:01
【问题描述】:

我正在从 firebase 存储中获取图像并希望使用SDWebImage 对其进行缓存,但在我的ViewController 中它会继续下载。请指导我如何缓存图像

 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! demoCell
        cell.textDemo.text = images[indexPath.row]

        var images_list = [String]()
        images_list.append(images[indexPath.row])
        images_list.append(images[indexPath.row] + "1")
        let storage = Storage.storage().reference()
        var imagesarray = [URL]()


        for x in images_list{
        let storageRef = storage.child("images/\(x).jpg")
        storageRef.downloadURL { (url, error) in
            if let error = error{
                print(error.localizedDescription)
            }
            else if let downloadURL = url?.absoluteString{
                cell.imageDemo.image = SDImageCache.shared().imageFromCache(forKey: downloadURL)
                print("Image Cached")
            }
            else{
                cell.imageDemo.sd_setImage(with: url!, completed: nil)
            }
        }
    }
    return cell
    }

【问题讨论】:

  • SDWebimage已经默认做了这个事情,不需要SDImageCache这样做。
  • 我之前确实回答了这个问题。当您执行 sd_setImage 时,它会被缓存,如果下次 URL 相同,则从缓存中获取图像。此外,通过在表格外部下载 dataSource 然后仅使用 url,可以提高您在 cellForRowAt 上做事的效率
  • 我也按照您的建议做了同样的事情,但是当我这样做时,每次滚动表格视图时都会下载图像。现在我将发布一个答案,请查看并帮助我了解如何在用户没有互联网连接时离线存储它
  • 如果您的问题仍然存在,您可以使用 KingFisher
  • 肯定会尝试的

标签: swift caching sdwebimage


【解决方案1】:

而不是写:

cell.imageDemo.image = SDImageCache.shared().imageFromCache(forKey: downloadURL)

试试这个:

cell.imageDemo.sd_setImage(with: URL(string: downloadURL), placeholderImage: UIImage(named: "Your Default Image"))

SDWebImage 将在此处处理缓存部分。

【讨论】:

  • 感谢兄弟的帮助,我会发布答案,请查看并帮助我如何将图像离线存储为磁盘缓存
【解决方案2】:

这是我解决问题的方法

var value : Any?
var vc = ViewController()
var images = [String]()
var downloads_array = [URL]()


override func viewDidLoad() {
    super.viewDidLoad()
    getImageNames()
    downloadImages()

}

func downloadImages(){
    let storage = Storage.storage().reference()

    for x in images{
    let storageRef = storage.child("images/\(x).jpg")
        storageRef.downloadURL { (url, error) in
            if let error = error{
                print(error.localizedDescription)
            }
            else{
                self.downloads_array.append(url!)
                self.tableView.reloadData()
            }
        }
    }
}

func getImageNames(){
    images = vc.images
}

override func numberOfSections(in tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return downloads_array.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! demoCell
    cell.textDemo.text = images[indexPath.row]

    if let downloadURL = SDImageCache.shared().imageFromCache(forKey: downloads_array[indexPath.row].absoluteString){
        cell.imageDemo.image = downloadURL
    }
    else{
        cell.imageDemo.sd_setImage(with: downloads_array[indexPath.row], completed: nil)
    }



    return cell
}

【讨论】:

    猜你喜欢
    • 2012-10-13
    • 2018-08-05
    • 2019-06-19
    • 2016-08-01
    • 2014-04-15
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    相关资源
    最近更新 更多