参考原文NSCache详解
首先说明 两个类没有任何关系!
NSCache基本信息
NSCache是Foundation框架提供的缓存类的实现,使用方式类似于可变字典,最重要的是它是线程安全的,而NSMutableDictionary不是线程安全的,在多线程环境下使用NSCache是更好的选择。
在内存不足时NSCache会自动释放存储的对象。
NSCache的键key不会被复制,所以key不需要实现NSCopying协议。
可以设置缓存的最大数量,当缓存数量满的时候,再添加将先删除先添加的对象再增加。
唯一一个代理方法是一个对象将被删除时调用,调用方式有以下几种:
NSCache缓存对象自身被释放
手动调用removeObjectForKey:方法
手动调用removeAllObjects
缓存中对象的个数大于countLimit,或,缓存中对象的总cost值大于totalCostLimit
程序进入后台后
收到系统的内存警告
实际应用 SDWebImage
SDImageCacheConfig中可以配置是否使用内存做缓存,默认为YES
磁盘缓存的最大时常,默认为一周
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)偶尔更新:可以定期更改缓存策略 或者 清除缓存
提示:如果大量使用缓存,会越积越大,建议定期清除缓存
网友评论