Swift(iOS/macOS)中的缓存:Redis、NSCache 及其他解决方案

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Swift(iOS/macOS)中的缓存:Redis 及其他工具



缓存是优化 Swift 移动和桌面应用程序性能的关键策略之一。它可以减少数据加载时间、降低网络和服务器负载,并确保应用程序在离线模式下运行。在 Apple 生态系统中,既有内置机制(NSCache、URLCache),也有第三方解决方案,包括与 Redis 的集成。本文将结合代码示例,详细分析 iOS 和 macOS 的主要缓存工具。



1. Foundation 中的内置缓存机制



NSCache — 轻量级内存缓存

NSCache 是一个线程安全、自动管理的缓存,在内存不足时会自动删除对象。非常适合临时存储图像、模型数据或计算结果。



import Foundation

let imageCache = NSCache<NSString, UIImage>()

// 设置限制imageCache.countLimit = 100 // 最多 100 个对象imageCache.totalCostLimit = 50 * 1024 * 1024 // 50 MB

// 保存func cacheImage(_ image: UIImage, forKey key: String) { imageCache.setObject(image, forKey: key as NSString, cost: image.size.width * image.size.height * 4)}

// 获取func getCachedImage(forKey key: String) -> UIImage? { return imageCache.object(forKey: key as NSString)}


优点:简单、自动清理、支持对象开销。

缺点:仅限内存缓存,无持久性。



URLCache — HTTP 请求缓存

URLCache 自动缓存 URLSession 的响应。既可在内存中运行,也可在磁盘上运行。可全局配置或针对特定会话配置。



import Foundation

// 配置缓存:内存 50 MB,磁盘 100 MBlet cache = URLCache(memoryCapacity: 50 * 1024 * 1024, diskCapacity: 100 * 1024 * 1024, diskPath: "myCache")URLCache.shared = cache

// 与 URLSession 一起使用let config = URLSessionConfiguration.defaultconfig.urlCache = cacheconfig.requestCachePolicy = .returnCacheDataElseLoadlet session = URLSession(configuration: config)

let request = URLRequest(url: URL(string: "https://api.example.com/data")!)let task = session.dataTask(with: request) { data, response, error in // 数据将自动缓存}task.resume()


缓存策略通过服务器的 Cache-Control 标头或 requestCachePolicy 进行管理。



2. 用于离线访问的文件缓存

当需要在应用程序启动之间保存数据时,可使用 Caches 目录中的文件缓存。适用于 JSON、图像或序列化对象。



import Foundation

class FileCache { private let fileManager = FileManager.default private lazy var cacheDirectory: URL = { let paths = fileManager.urls(for: .cachesDirectory, in: .userDomainMask) return paths[0].appendingPathComponent("DataCache", isDirectory: true) }() init() { try? fileManager.createDirectory(at: cacheDirectory, withIntermediateDirectories: true) } func save(data: Data, forKey key: String) { let fileURL = cacheDirectory.appendingPathComponent(key) try? data.write(to: fileURL) } func load(forKey key: String) -> Data? { let fileURL = cacheDirectory.appendingPathComponent(key) return try? Data(contentsOf: fileURL) } func clearAll() { try? fileManager.removeItem(at: cacheDirectory) try? fileManager.createDirectory(at: cacheDirectory, withIntermediateDirectories: true) }}


3. Redis — 用于服务器端的分布式缓存

推荐