首页 > 解决方案 > 如何快速将多张图片从 URL 保存到本地存储?

问题描述

我正在开发餐厅应用程序。有 340 个食品数据。我从使用 Laravel 开发的后端获取这些数据。应用程序在网上运行良好。但是,虽然网络已关闭,但所有食物数据都应显示在应用程序中。所以,我试图将食物数据保存到本地。最好将文本数据保存到本地(确切地说是 UserDefaults 和 FileSystem)。但是,当我尝试将图像从 url 保存到本地时,它会发生错误并且不会完全保存到本地。

你见过这样的问题吗?如果是,我感谢您的帮助。谢谢

标签: swiftuserdefaultsnetwork-connection

解决方案


我不确切知道您遇到了什么错误,但我认为链接的答案可以帮助您。

此外,图像数据最好被缓存。
如果您基于 通信URLSession,您可以按如下方式处理缓存。

  • 将图像保存到缓存

    Cache.imageCache.setObject(image, forKey: url.absoluteString as NSString)

  • 调出缓存的图像

    let cacheImage = Cache.imageCache.object(forKey: url.absoluteString as NSString)

代码

class Cache {
   static let imageCache = NSCache<NSString, UIImage>()
}


extension UIImageView {
  func imageDownload(url: URL, contentMode mode: UIView.ContentMode = .scaleAspectFit) {
    if let cacheImage = Cache.imageCache.object(forKey: url.absoluteString as NSString) {
        DispatchQueue.main.async() { [weak self] in
            self?.contentMode = mode
            self?.image = cacheImage
        }
    }
    else {
        var request = URLRequest(url: url)
        request.httpMethod = "GET"

        URLSession.shared.dataTask(with: request) { data, response, error in
            guard
                let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200,
                let mimeType = response?.mimeType, mimeType.hasPrefix("image"),
                let data = data, error == nil,
                let image = UIImage(data: data)
                else {
                    print("Download image fail : \(url)")
                    return
            }

            DispatchQueue.main.async() { [weak self] in
                print("Download image success \(url)")

                Cache.imageCache.setObject(image, forKey: url.absoluteString as NSString)

                self?.contentMode = mode
                self?.image = image
            }
         }.resume()
      }
   }
}

为了使缓存更方便,请使用一个名为Kingfisher.


推荐阅读