现在很多应用需要用到离线缓存,以前我尝试过用fmdb数据库做缓存,可是感觉太复杂,用coreData呢,要建立好多文件,有不少设置,也不简单.后来发现了YYCache,很好用,现在我做两个demo,一个是用AFN+YYCache实现离线缓存,一个是用NSURLProtocol+YYCache实现包括webView在内的缓存,我还写了一些好用的工具类,你要想快速掌握缓存,看我的demo就行了.
AFN+YYCache实现离线缓存 github地址
NSURLProtocol+YYCache缓存github地址
AFN+YYCache实现离线缓存
YYCache一般用法如下:
- 初始化 设置缓存策略 数据保存时间
YYCache cache = [[YYCache alloc] initWithName:kCachePath] ;
cache.diskCache.ageLimit = 360012*7;//保存的最大天数单位秒 隔几天删除一次重新请求
// cache.diskCache.costLimit 允许占用的最大容量单位是db
cache.diskCache.totalCost : 占用的容量单位是db
cache.memoryCache.shouldRemoveAllObjectsOnMemoryWarning = YES;
cache.memoryCache.shouldRemoveAllObjectsWhenEnteringBackground = YES;
数据储存
YYCache可以储存遵守NSCopying协议的数据
[cache setObject:requestData forKey:cacheKey];数据读取
id cacheData = [cache objectForKey:cacheKey];
id myResult = [NSJSONSerialization JSONObjectWithData:cacheData options:NSJSONReadingMutableContainers error:nil];
我写了一个afn网络请求的工具类,用这个工具类请求的自然缓存了,一般用一个key存储不同的请求,我用url当做key.
我还写了一个工具类,来计算设备可用容量,缓存占用空间等,放进去直接可用.
NSURLProtocol+YYCache实现webView缓存
NSURLProtocol能够让你去重新定义苹果的URL加载系统的行为,URL Loading System里有许多类用于处理URL请求.通过它和YYCache做网络缓存很方便,
网页请求如果是重定向的话其实是两次请求,第一次请求服务器给浏览器一个url,浏览器再请求这个url,要对重定向特殊处理.比如我们手机访问 一个网址"www.163.com",服务器会先返回一个适合手机的url"3g.163.com",浏览器会自动再次请求这个url.
加载url时候会调用NSURLProtocol的很多方法,demo里面的方法是按顺序调用的
- (BOOL)canInitWithRequest:(NSURLRequest *)request
这个方法主要是说明你是否打算处理对应的request,如果不打算处理,返回NO,URL Loading System会使用系统默认的行为去处理;如果打算处理,返回YES,用于过滤你不想做缓存的url.
AFN默认这里都返回NO,你想自己的请求自动缓存的话,自己写一个网络请求类,demo里我写了一个简单的.
(void)startLoading
//这两个方法主要是开始和取消相应的request,而且需要标示那些已经处理过的request。在里面先看是否有缓存再进行其他操作.
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
在这个方法里进行数据保存
详细的内容看代码就行.