Disk Cache — 是一种在设备磁盘上临时存储数据的机制,允许 iOS 应用程序加速对先前加载资源的重复访问。根据 Apple Developer Documentation, 2024,Disk Cache 减少了网络使用,降低了电池负载,并确保应用程序在离线模式下运行。iOS 提供了几种内置缓存机制:用于网络请求的 URLCache、用于内存的 NSCache 以及通过 Caches 目录的自定义实现。
要点
Disk Cache — 是一种在设备永久存储介质(闪存)上临时存储数据以加速后续对相同数据请求的技术。与 RAM 缓存不同,Disk Cache 在应用程序甚至设备重启后仍保留数据。
iOS 提供两个主要的缓存级别:操作级别(NSCache,内存)和磁盘级别(URLCache,文件系统)。磁盘缓存比操作缓存慢 10-100 倍,但比网络请求快得多 — 差异可达 2-3 个数量级。最优策略使用两级缓存:内存用于热数据,磁盘用于冷数据。
根据 Apple Performance Optimization Guide, 2023,正确配置的 Disk Cache 可将重复查看的内容加载时间减少 60-80%,并将流量消耗降低 40-70%。对于包含媒体内容(图像、视频、音频)的应用程序,缓存是关键的 UX 因素。
URLCache — 是一个内置的 Foundation 类,为 URLSession 请求实现组合缓存。它会自动将服务器响应保存到磁盘和内存,基于 HTTP 标头 Cache-Control、Expires 和 ETag 管理缓存大小和失效策略。
import Foundation
let cache = URLCache(
memoryCapacity: 50 * 1024 * 1024,
diskCapacity: 200 * 1024 * 1024,
diskPath: "network-cache"
)
URLCache.shared = cache
let config = URLSessionConfiguration.default
config.urlCache = cache
config.requestCachePolicy = .returnCacheDataElseLoad
let session = URLSession(configuration: config)
URLCache 的缓存策略 确定何时使用缓存数据以及何时执行新请求。主要策略:useProtocolCachePolicy(基于服务器标头)、reloadIgnoringLocalCacheData(始终从服务器获取)、returnCacheDataElseLoad(优先使用缓存)、returnCacheDataDontLoad(仅使用缓存 — 离线模式)。
Cache-Control — 服务器随响应发送的 HTTP 标头,指示 max-age(以秒为单位的生存时间)、must-revalidate(检查及时性)、no-cache(未经验证不使用)和 no-store(不缓存)。iOS 在使用 URLCache 并采用 useProtocolCachePolicy 策略时,会自动严格遵守这些标头。
自定义缓存 在内置 URLCache 不足时需要:用于存储已处理的图像、序列化的数据模型或计算结果。在这种情况下,开发人员基于应用程序 Sandbox 中的 Caches 目录创建自己的缓存系统。
class DiskCache<T: Codable> {
private let cacheDir: URL
private let encoder = JSONEncoder()
private let decoder = JSONDecoder()
init() {
let paths = FileManager.default
.urls(for: .cachesDirectory,
in: .userDomainMask)
cacheDir = paths[0].appendingPathComponent(
"data-cache", isDirectory: true
)
try? FileManager.default
.createDirectory(at: cacheDir,
withIntermediateDirectories: true)
}
func set(value: T, for key: String) {
let url = cacheDir.appendingPathComponent(
SHA256.hash(key)
)
if let data = try? encoder.encode(value) {
try? data.write(to: url)
}
}
func get(for key: String) -> T? {
let url = cacheDir.appendingPathComponent(
SHA256.hash(key)
)
guard let data = try? Data(contentsOf: url) else { return nil }
return try? decoder.decode(T.self, from: data)
}
func clearAll() {
try? FileManager.default
.removeItem(at: cacheDir)
}
}
缓存失效策略 确定存储数据何时被视为过时:TTL(Time-To-Live)— 数据在写入后存活固定时间;event-driven — 事件发生时失效(例如,服务器上数据更新);version-based — API 版本或数据格式更改时失效;LRU(Least Recently Used)— 超出大小限制时自动删除最不常用的记录。
实践规则: TTL 适用于新闻和可预测过期的内容。Event-driven — 适用于通过推送通知由服务器管理的数据。Version-based — 适用于配置和数据模型缓存。LRU — 适用于磁盘空间有限的媒体文件的通用选择。
Disk Cache 的性能 通过命中率来衡量 — 无需访问网络即可从缓存满足的请求百分比。配置良好的图像缓存的典型命中率为 70-90%,API 响应为 40-60%,流媒体视频为 30-50%。
| 数据类型 | 典型命中率 | 建议缓存大小 |
|---|---|---|
| 图像 | 70-90% | 100-500 MB |
| API JSON 响应 | 40-60% | 10-50 MB |
| 视频/音频 | 30-50% | 500 MB — 1 GB |
| 字体和资源 | 90-99% | 5-20 MB |
| 网页内容 | 50-70% | 50-200 MB |
iOS 中 Disk Cache 的限制: 系统可以在磁盘空间不足时随时删除 Caches 目录的内容。此行为不可配置 — iOS 自行决定何时以及删除哪些缓存文件。因此,缓存不应包含无法从网络或其他来源恢复的数据。
对闪存的影响: 频繁写入 Disk Cache 会加速闪存的磨损。iOS 使用 TRIM 和磨损均衡来最小化磨损,但建议开发人员避免过度写入:不要对同一文件超过每 5 分钟更新一次缓存;将小写入分组为一次;对不需要存储在磁盘上的临时数据使用 NSCache。
两级缓存 — iOS 应用程序的标准架构:内存(NSCache)用于频繁访问的数据,磁盘(URLCache 或自定义)用于应在会话之间保留的数据。内存中的生存时间 — 分钟,磁盘上 — 小时或天。
图像缓存: 使用专门的库(Kingfisher、SDWebImage、Nuke),它们实现具有自动失效、内存管理和异步磁盘写入的两级缓存。自行实现图像缓存需要考虑解码、色彩空间和缩放。
缓存与安全: 不要在没有加密的情况下将机密数据(密码、令牌、个人数据)缓存在磁盘上。URLCache 默认不加密数据 — 对敏感内容使用 NSFileProtection 或应用程序级加密。对于带认证的网络请求,使用 .reloadIgnoringLocalCacheData 策略。
缓存监控: 跟踪命中率、当前缓存大小和每分钟写入次数。如果命中率降至 30% 以下 — 缓存效率低下,需要审查策略或增加大小。根据 Point-Free (2024),缓存监控是 iOS 应用程序性能优化中最被低估的实践之一。
常见问题
Disk Cache — 是一种将数据存储在设备磁盘上以加速重复访问的技术。在 iOS 中,内置的 URLCache 缓存 HTTP 响应,开发人员可以通过 Caches 目录创建自定义缓存。
RAM Cache(NSCache)将数据存储在内存中 — 速度更快,但在应用程序重启时会丢失。Disk Cache 较慢,但在会话之间保留。最优策略使用两个级别:内存用于热数据,磁盘用于冷数据。
是的,系统可以在空间不足时随时删除 Caches 目录的内容。因此,切勿在缓存中存储无法恢复的数据。对于用户文档,请使用 Documents 目录。
缓存大小 取决于数据类型:图像为 100-500 MB,API 响应为 10-50 MB,视频可达 1 GB。跟踪命中率 — 如果低于 50%,请增加缓存大小或更改失效策略。
URLCache.removeAllCachedResponses() 清除内置缓存。对于自定义缓存,通过 FileManager 从 Caches 目录删除文件。始终在应用程序设置中为用户提供清除缓存的选项。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。