logo头像

小玉的技术博客

NSURLCache详解

前言

NSURLCache 为您的应用的 URL 请求提供了内存中以及磁盘上的综合缓存机制。 作为基础类库 URL 加载系统 的一部分,任何通过 NSURLConnection 加载的请求都将被 NSURLCache 处理。网络缓存减少了需要向服务器发送请求的次数,同时也提升了离线或在低速网络中使用应用的体验。

NSURLCache 通过将NSURLRequest对象映射到NSCachedURLResponse对象来实现对URL加载请求的响应的缓存。 它包含内存缓存和磁盘缓存,并允许您操作内存和磁盘部分的大小。 您还可以设置持久化存储缓存数据的路径。

【注】在iOS中,当系统磁盘空间不足时,可能会清除磁盘缓存,但仅当您的应用程序未运行时才会清除磁盘缓存。

线程安全

在iOS 8及更高版本以及macOS 10.10及更高版本中,NSURLCache是线程安全的。
尽管可以安全地从多个执行上下文同时调用NSURLCache实例方法,但请注意,在尝试读取或写入同一请求的响应时,像cachedResponseForRequest:和storeCachedResponse:forRequest:这样的方法具有不可避免的竞争条件。

NSURLCache的子类必须以这种线程安全的方式实现重写方法。

子类注释

NSURLCache类旨在按原样使用,但如果您有特定需求,则可以将其子类化。 例如,您可能希望筛选缓存的响应,或出于安全性或其他原因重新实现存储机制。覆盖此类的方法时,请注意系统首选采用任务参数的方法,而不是那些方法。 因此,您应该在子类化时覆盖基于任务的方法,如下所示:

在缓存中存储响应 - 覆盖基于任务的storeCachedResponse:forDataTask:,而不是基于请求的storeCachedResponse:forRequest:。

从缓存中获取响应 - 覆盖getCachedResponseForDataTask:completionHandler:,而不是cachedResponseForRequest:或者除了cachedResponseForRequest:之外。

删除缓存的响应 - 覆盖基于任务的removeCachedResponseForDataTask:,而不是基于请求的removeCachedResponseForRequest:或者除了基于请求的removeCachedResponseForRequest:之外。

NSURLRequestCachePolicy

NSURLRequest 有个 cachePolicy 属性,它根据以下常量指定了请求的缓存行为:

  • NSURLRequestUseProtocolCachePolicy: 对特定的 URL 请求使用网络协议中实现的缓存逻辑。这是默认的策略。
  • NSURLRequestReloadIgnoringLocalCacheData:数据需要从原始地址加载。不使用现有缓存。
  • NSURLRequestReloadIgnoringLocalAndRemoteCacheData:不仅忽略本地缓存,同时也忽略代理服务器或其他中间介质目前已有的、协议允许的缓存。
  • NSURLRequestReturnCacheDataElseLoad:无论缓存是否过期,先使用本地缓存数据。如果缓存中没有请求所对应的数据,那么从原始地址加载数据。
  • NSURLRequestReturnCacheDataDontLoad:无论缓存是否过期,先使用本地缓存数据。如果缓存中没有请求所对应的数据,那么放弃从原始地址加载数据,请求视为失败(即:“离线”模式)。
  • NSURLRequestReloadRevalidatingCacheData:从原始地址确认缓存数据的合法性后,缓存数据就可以使用,否则从原始地址加载。

    参考文献

    https://developer.apple.com/documentation/foundation/nsurlcache?language=objc
支付宝打赏 微信打赏

赞赏是不耍流氓的鼓励