网络缓存策略
问题
iOS 中的网络缓存机制是什么?URLCache 和 HTTP 缓存头的关系?
答案
URLCache
URLCache 提供内存 + 磁盘两级缓存:
let cache = URLCache(
memoryCapacity: 10 * 1024 * 1024, // 10MB 内存缓存
diskCapacity: 50 * 1024 * 1024, // 50MB 磁盘缓存
diskPath: "network_cache"
)
URLCache.shared = cache
Cache-Control 策略
var request = URLRequest(url: url)
// 使用缓存策略
request.cachePolicy = .useProtocolCachePolicy // 默认:遵守 HTTP 缓存头
request.cachePolicy = .returnCacheDataElseLoad // 优先缓存
request.cachePolicy = .reloadIgnoringLocalCacheData // 忽略缓存
HTTP 缓存头
| 头部 | 说明 |
|---|---|
Cache-Control: max-age=3600 | 缓存 1 小时 |
Cache-Control: no-cache | 每次请求需验证 |
Cache-Control: no-store | 不缓存 |
ETag | 资源标识,条件请求 |
Last-Modified | 最后修改时间 |
常见面试问题
Q1: 强缓存和协商缓存的区别?
答案:
- 强缓存(
Cache-Control: max-age):在有效期内直接使用缓存,不发请求 - 协商缓存(
ETag/Last-Modified):发请求验证资源是否变化,304 则用缓存
Q2: 如何实现离线模式?
答案:
- 请求成功时缓存响应数据
- 无网络时使用
request.cachePolicy = .returnCacheDataDontLoad - 配合
NWPathMonitor监听网络状态切换策略