跳到主要内容

网络缓存策略

问题​

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: 如何实现离线模式?​

答案:

  1. 请求成功时缓存响应数据
  2. 无网络时使用 request.cachePolicy = .returnCacheDataDontLoad
  3. 配合 NWPathMonitor 监听网络状态切换策略

相关链接​