iOS图片下载、缓存与读取优化全流程详解

1. 网络请求

在 iOS 中,使用 URLSession 可以方便地实现图片的网络下载。通过设置目标 URL 并启动 URLSessionDataTask,可以在后台获取图片数据。

let url = URL(string: "http://example.com/image.jpg")!
let task = URLSession.shared.dataTask(with: url) { data, response, error in
    // 处理下载后的数据
}
task.resume()

2. 本地存储

将图片数据存储到本地的 Documents 目录,以便后续读取和使用。使用 FileManager 获取目录路径并保存数据。

let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let fileURL = documentsDirectory.appendingPathComponent("image.jpg")
if let imageData = data {
    try? imageData.write(to: fileURL)
}

3. 图片缓存

  • NSCache:内存缓存,适合存储最近访问的图片。通过将 UIImage 对象和 URL 作为键值对保存,可以减少网络请求频率。
let cache = NSCache()
if let image = UIImage(data: data) {
    cache.setObject(image, forKey: url.absoluteString as NSString)
}

4. 磁盘缓存

可以采用第三方库如 SDWebImage 来实现磁盘缓存管理,使图片资源的下载和缓存更加高效。

UIImageView.sd_setImage(with: url, placeholderImage: UIImage(named: "placeholder"), options: [.refreshCached], completion: { (image, error, cacheType, url) in
    // 图片加载完成的回调
})

5. 显示图片

在 UI 中展示图片时,通过 UIImageView 加载缓存或本地文件中的图片资源。

if let image = cache.object(forKey: url.absoluteString as NSString) {
    imageView.image = image
} else if let fileImage = UIImage(contentsOfFile: fileURL.path) {
    imageView.image = fileImage
}

6. 优化策略

  • 异步加载:确保图片下载和显示在后台线程中完成,避免阻塞主线程。
  • 占位图:在图片加载过程中使用占位图,提升用户体验。
  • 尺寸适配:根据实际需要调整图片尺寸,避免加载不必要的大图。
  • 缓存策略:如 LRU(最近最少使用)策略,根据图片的重要性设置缓存优先级。

7. 清理缓存

设定最大缓存容量,当缓存空间不足时自动删除较旧数据,或在应用进入后台时清理缓存。

zip 文件大小:38.07KB