跳到主要内容

网络缓存策略

问题

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 监听网络状态切换策略

相关链接