介绍:为什么需要在 Swift 应用程序中使用缓存?
现代 iOS 和 macOS 应用程序处理大量数据:图像、API 的 JSON 响应、计算结果。如果没有缓存,每次数据访问都会导致重新加载或重新计算,这对性能、流量消耗和响应时间产生负面影响。Swift 中的缓存是一种策略,将常用数据临时存储在快速存储(内存或本地磁盘)中以加速访问。
在本文中,我们将探讨 Swift 生态系统中的三种主要缓存方法:
- 内置解决方案:
NSCache和URLCache—— 适用于大多数任务的轻量级高效工具。 - Redis —— 用于分布式系统的强大服务器端缓存。
- Memcached —— 高性能内存缓存系统。
您将了解如何将这些工具中的每一个集成到 Swift 项目中,查看代码示例,并理解针对特定任务应选择哪种方案。
内置解决方案:NSCache 和 URLCache
Apple 提供了两种强大的内置缓存机制,无需安装第三方库。它们非常适合移动开发中 90% 的任务。
NSCache —— 内存缓存
NSCache 是一个具有自动内存管理的线程安全字典。它在内存不足时自动删除对象,使其成为缓存图像、数据模型和任何重型对象的理想选择。
import Foundation
// 为 UIImage 创建缓存
let imageCache = NSCache<NSString, UIImage>()
// 带缓存的图像加载函数
func loadImage(from url: URL, completion: @escaping (UIImage?) -> Void) {
// 检查缓存
if let cachedImage = imageCache.object(forKey: url.absoluteString as NSString) {
completion(cachedImage)
return
}
// 加载数据
URLSession.shared.dataTask(with: url) { data, response, error in
guard let data = data, let image = UIImage(data: data) else {
completion(nil)
return
}
// 保存到缓存
imageCache.setObject(image, forKey: url.absoluteString as NSString)
completion(image)
}.resume()
}
NSCache 的优势:
- 收到内存警告时自动清理
- 无需额外锁定的线程安全
- 能够设置对象数量和总成本的限制
URLCache —— HTTP 响应缓存
URLCache 是一个用于 HTTP 请求的系统级缓存。它将服务器响应保存到磁盘和内存,并根据 HTTP 头(Cache-Control, Expires)自动管理其生命周期。
import Foundation
// 配置 URLCache(通常在 AppDelegate 或 SceneDelegate 中)
let cacheSize = 50 * 1024 * 1024 // 50 MB
let urlCache = URLCache(memoryCapacity: cacheSize, diskCapacity: cacheSize, diskPath: "myCache")
URLCache.shared = urlCache
// 带缓存的请求示例
let request = URLRequest(url: URL(string: "https://api.example.com/data")!)
URLSession.shared.dataTask(with: request) { data, response, error in
// URLCache 将根据 Cache-Control 头自动处理缓存
}.resume()
何时使用 URLCache:
- 用于缓存 REST API 响应
- 用于静态资源(图像、配置文件)
- 当需要遵守服务器缓存策略时
Redis —— 用于 Swift 后端的分布式缓存
Redis 是一个高性能的内存数据存储,通常用作缓存服务器。对于 Swift,有多个客户端可用,最流行的