美文网首页
iOS中NSCache与NSURLCache理解和使用

iOS中NSCache与NSURLCache理解和使用

作者: 寻找最亮的光 | 来源:发表于2018-04-16 17:52 被阅读111次

    参考原文NSCache详解

    首先说明 两个类没有任何关系!

    NSCache基本信息

    NSCache是Foundation框架提供的缓存类的实现,使用方式类似于可变字典,最重要的是它是线程安全的,而NSMutableDictionary不是线程安全的,在多线程环境下使用NSCache是更好的选择。

    在内存不足时NSCache会自动释放存储的对象。

    NSCache的键key不会被复制,所以key不需要实现NSCopying协议。

    可以设置缓存的最大数量,当缓存数量满的时候,再添加将先删除先添加的对象再增加。

    唯一一个代理方法是一个对象将被删除时调用,调用方式有以下几种:

    NSCache缓存对象自身被释放

    手动调用removeObjectForKey:方法

    手动调用removeAllObjects    

    缓存中对象的个数大于countLimit,或,缓存中对象的总cost值大于totalCostLimit    

    程序进入后台后

    收到系统的内存警告

    实际应用 SDWebImage

    SDImageCacheConfig中可以配置是否使用内存做缓存,默认为YES

    磁盘缓存的最大时常,默认为一周

    NSURLCache 网络缓存

    参考文章NSCache与NSURLCache

    AFN缓存机制   NSCache详解   NSURLCache详解

    系统帮我们做的缓存,好处是自动,无需我们进行复杂的设置。坏处也恰恰是这个:不够灵活,不能自定义。只能指定一个缓存的总文件夹,不能分别指定每一个文件缓存的位置,更不能为每个文件创建一个文件夹,也不能指定文件夹的名称。缓存的对象也是固定的:只能是 GET请求的返回值。

    服务器压力、客户端网络优化、用户体验与流量等等需要我们做网络缓存。

    iOS 5.0开始,支持磁盘缓存,但仅支持 HTTP

    iOS 6.0开始,支持 HTTPS 缓存

    Etag

    Etag全称是Entity Tag,一般用于标识URL对象是否发生了改变。

    使用Etag一般会出现如下的请求流程:

    客户端首次访问一个Rest API,后端返回一串JSON数据,并在请求头中添加一个Etag标签,这个标签对应的是一个用MD5或者SHA1等哈希算法 来生成的信息指纹。

    客户端保存这个Etag值,再次发起请求的时候,以If-None-Match作为Key添加到请求头中

    服务端校验请求头中的Etag数据,并跟当前将要输出数据的指纹做校验,如果一致,则表明没有更改,返回状态码为304,如果不一致, 则返回200,并将新的Etag同时返回,以便下次客户端请求时使用

    网络请求性能优化的策略

    一.减少请求带宽

    1.请求压缩

    2.响应压缩

    AFNetworking使用NSURLConnection,它利用了原生的缓存机制NSURLCache。NSURLCache缓存了从服务器返回的NSURLResponse对象。

    NSURLCache的shareCache方法默认是可以使用的,缓存获取的内容。不幸的是,它的默认配置只是缓存在内存并没有写到硬盘。为了解决这个问题,你可以声明一个 sharedCache

    三、缓存的实现

    1.说明:

    由于GET请求一般用来查询数据,POST请求一般是发大量数据给服务器处理(变动性比较大)

    因此一般只对GET请求进行缓存,而不对POST请求进行缓存

    在iOS中,可以使用NSURLCache类缓存数据

    iOS 5之前:只支持内存缓存。从iOS 5开始:同时支持内存缓存和硬盘缓存

    2.NSURLCache

    iOS中得缓存技术用到了NSURLCache类。

    缓存原理:一个NSURLRequest对应一个NSCachedURLResponse

    缓存技术:把缓存的数据都保存到数据库中。

    3.NSURLCache的常见用法

    (1)获得全局缓存对象(没必要手动创建)NSURLCache *cache = [NSURLCache sharedURLCache];

    (2)设置内存缓存的最大容量(字节为单位,默认为512KB)- (void)setMemoryCapacity:(NSUInteger)memoryCapacity;

    (3)设置硬盘缓存的最大容量(字节为单位,默认为10M)- (void)setDiskCapacity:(NSUInteger)diskCapacity;

    (4)硬盘缓存的位置:沙盒/Library/Caches

    (5)取得某个请求的缓存- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request;

    (6)清除某个请求的缓存- (void)removeCachedResponseForRequest:(NSURLRequest *)request;

    (7)清除所有的缓存- (void)removeAllCachedResponses;

    4.缓存GET请求

    要想对某个GET请求进行数据缓存,非常简单

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    // 设置缓存策略

    request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;

    只要设置了缓存策略,系统会自动利用NSURLCache进行数据缓存

    5.iOS对NSURLRequest提供了7种缓存策略:(实际上能用的只有4种)

    NSURLRequestUseProtocolCachePolicy // 默认的缓存策略(取决于协议)

    NSURLRequestReloadIgnoringLocalCacheData // 忽略缓存,重新请求

    NSURLRequestReloadIgnoringLocalAndRemoteCacheData // 未实现

    NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData // 忽略缓存,重新请求

    NSURLRequestReturnCacheDataElseLoad// 有缓存就用缓存,没有缓存就重新请求

    NSURLRequestReturnCacheDataDontLoad// 有缓存就用缓存,没有缓存就不发请求,当做请求出错处理(用于离线模式)

    NSURLRequestReloadRevalidatingCacheData // 未实现

    6.缓存的注意事项

    缓存的设置需要根据具体的情况考虑,如果请求某个URL的返回数据:

    (1)经常更新:不能用缓存!比如股票、彩票数据

    (2)一成不变:果断用缓存

    (3)偶尔更新:可以定期更改缓存策略 或者 清除缓存

    提示:如果大量使用缓存,会越积越大,建议定期清除缓存

    相关文章

      网友评论

          本文标题:iOS中NSCache与NSURLCache理解和使用

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