美文网首页
30期_iOS_NSURLSession的缓存深入探究

30期_iOS_NSURLSession的缓存深入探究

作者: 萧修 | 来源:发表于2023-09-01 01:00 被阅读0次

    探究WK缓存,可以从NSURLRequest入手,通过其加载URL并设置缓存策略,

    缓存策略

    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];
    
    typedef NS_ENUM(NSUInteger, NSURLRequestCachePolicy)
    {
        NSURLRequestUseProtocolCachePolicy = 0, // 默认策略,具体的缓存逻辑和协议的声明有关,如果协议没有声明,不需要每次重新验证cache
        NSURLRequestReloadIgnoringLocalCacheData = 1, // 忽略本地缓存,直接从服务器请求数据
        NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, // iOS 13 才实现,忽略本地缓存数据、代理和其他中介的缓存,直接从从服务器请求数据
        NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,
        NSURLRequestReturnCacheDataElseLoad = 2, // 优先从本地拿数据,且忽略请求生命时长和过期时间。但是如果没有本地cache,则从服务器请求数据
        NSURLRequestReturnCacheDataDontLoad = 3, // 只从本地拿数据
        NSURLRequestReloadRevalidatingCacheData = 5, //  iOS 13才实现,从原始地址确认缓存数据的合法性后,缓存数据就可以使用,否则从服务器请求数据
    };
    

    NSURLRequestUseProtocolCachePolicy

    分析默认缓存流程

    • 缓存不存在,则直接从服务器获取数据
    • 缓存存在,从响应response头信息获取【是否每次必须进行资源更新,且缓存状态是够更新等条件】必须更新
    • 缓存过期或者每次必须校验资源更新,会进行一个资源更新请求,有更新使用服务器返回新数据,没有更新用本地数据

    解析HTTP协议缓存

    客户端默认缓存实际由服务器控制,客户端和服务器通过http请求头和响应头的缓存字段控制,进而影响客户端的行为

    • Cache-Control:max-age=xxx
      第一次请求服务器资源的时候,服务器需要使用Cache-Control响应头指定缓存过期时间

    • Last-Modified/if-Modifired-Since
      Last-Modified:由服务器返回响应头,标识资源修最后的修改时间
      if-Modifired-Since:客户端发送,表示客户端记录,资源最后的修改时间,服务器收到带有该请求头的请求时,会使用该时间与资源的最后修改时间进行对比,如果发现资源未被修改,则直接返回304,告诉客户端使用本地缓存,否则响应完整的消息内容

    • Etag/if-None-Match
      Etag由服务器发送,告知资源在服务器的一个标识。
      客户端请求时,如果发现资源过期(用Cache-Control判断),发现资源带有Etag标识,这时请求服务器带上if-none-match头,服务器收到之后与资源表示进行对比,决定返回304或者200

    相关文章

      网友评论

          本文标题:30期_iOS_NSURLSession的缓存深入探究

          本文链接:https://www.haomeiwen.com/subject/iwsxmdtx.html