首页 > 代码库 > IOS 缓存思路

IOS 缓存思路


为了提高程序的响应速度,可以考虑使用缓存(内存缓存\硬盘缓存)

 技术分享

 

第一次请求数据时
内存缓存中没有数据
硬盘缓存中没有数据

技术分享

 

技术分享

 

当服务器返回数据时,需要做以下步骤
使用服务器的数据(比如解析、显示)
将服务器的数据缓存到硬盘(沙盒)

此时缓存的情况是
内存缓存中有数据
硬盘缓存中有数据

 

 技术分享

如果程序并没有被关闭,一直在运行
内存缓存中有数据
硬盘缓存中有数据

如果再次请求数据,直接使用内存缓存中的数据即可  
如果程序重新启动
内存缓存已经消失,没有数据
硬盘缓存依旧存在,还有数据

一旦从硬盘缓存中读取数据,内存缓存中又有数据了

技术分享

一般只对GET请求进行缓存,不必对POST请求进行缓存
GET请求一般用来查询数据
POST请求一般是发大量数据给服务器处理(变动性比较大)

在iOS中,可以使用NSURLCache类缓存数据
iOS 5之前:只支持 内存缓存
iOS 5开始:同时支持 内存缓存 和 硬盘缓存

NSURLCache了解
缓存原理:一个NSURLRequest对应一个NSCachedURLResponse
缓存技术:数据库

技术分享

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

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

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

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

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

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

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

 

 

 技术分享

发送JSON给服务器

为了提高程序的响应速度,可以考虑使用缓存(内存缓存\硬盘缓存)


要想对某个GET请求进行数据缓存,非常简单
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 设置缓存策略
request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;

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

 

技术分享

iOS对NSURLRequest提供了7种缓存策略:(实际上能用的只有3种)
NSURLRequestUseProtocolCachePolicy // 默认的缓存策略(取决于协议)
NSURLRequestReloadIgnoringLocalCacheData // 忽略缓存,重新请求
NSURLRequestReloadIgnoringLocalAndRemoteCacheData // 未实现
NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData // 忽略缓存,重新请求
NSURLRequestReturnCacheDataElseLoad
// 有缓存就用缓存,没有缓存就重新请求

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

NSURLRequestReloadRevalidatingCacheData // 未实现

 

技术分享

缓存看起来很美好,但需要谨慎使用
如果请求某个URL的返回数据
经常更新:不能用缓存!比如股票、彩票数据
一成不变:果断用缓存
偶尔更新:可以定期更改缓存策略 或者 清除缓存

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

 

IOS 缓存思路