swift - 如何快速将多张图片从 URL 保存到本地存储?
问题描述
我正在开发餐厅应用程序。有 340 个食品数据。我从使用 Laravel 开发的后端获取这些数据。应用程序在网上运行良好。但是,虽然网络已关闭,但所有食物数据都应显示在应用程序中。所以,我试图将食物数据保存到本地。最好将文本数据保存到本地(确切地说是 UserDefaults 和 FileSystem)。但是,当我尝试将图像从 url 保存到本地时,它会发生错误并且不会完全保存到本地。
你见过这样的问题吗?如果是,我感谢您的帮助。谢谢
解决方案
我不确切知道您遇到了什么错误,但我认为链接的答案可以帮助您。
此外,图像数据最好被缓存。
如果您基于 通信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
.
推荐阅读
- python - 考虑到可能的列排列,删除 spark 数据帧重复项
- mongodb - 使用单独的过滤器对数据进行分组(MongoDB 查询)
- sql - Spark sql-基于另一个聚合选项进行聚合
- node.js - 如何使用用两种不同语言(Flask、Node.js)编写的后端 docker 在单个服务器上运行
- android - 使用 customword 数组适配器而不是资源字符串数组 KOTLIN
- javascript - 询问如何在 Telegram 中为内联查询创建数组
- r - 在 R 中选择多个历史日期后,Rvest Web 抓取
- c++ - 将 [[no_unique_address]] 与空基类继承组合时得到意外结果
- go - 使用 GORM 将接口设置为具有许多实现的属性
- javascript - babel 如何理解何时导入本地路径以及何时从同名库中导入?