以前自己做项目 都是网络请求,没有研究过本地缓存,今天在网上找了一下资料,demo试了一下,其实很简单,现在做一下简单的记录:
iOS 5之前:只支持内存缓存。从iOS 5开始:同时支持内存缓存和硬盘缓存
代码(仅仅是网络缓存的代码部分):
//网络请求数据的类方法
+(void)sloveDataFromUrlString:(NSString *)aString dataBlock:(DataBlock)aBlock
{
任何通过NSURLConnection 加载的请求都会在 NSURLCache处理,因为AFNetworking使用了 NSURLConnection,说以也会被处理。
@第一种初始化NSURLCache 的方法
NSURLCache * cache = [NSURLCache sharedURLCache];//NSURLCache 是个单例类(系统自带的)
//
// NSString * librarystring = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES)[0];
// NSLog( @"librarystring %@",librarystring);//获得沙盒library的地址(系统为每个app都分配了一个封闭的内存空间,只有该app才能访问)
NSString * cachestring = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
NSLog(@"cachestring %@",cachestring);//获得沙盒cache的地址 (在linarary下面的文件夹,用来缓存文件)
// [cache setMemoryCapacity:5 * 1024 * 1024];//设置内存缓存的大小5M(默认是512K,字节为单位)
//
// [cache setDiskCapacity:10 * 1024 * 1024];//磁盘的缓存大小(默认是10M,硬盘缓存位置是 沙盒/Library/Caches )
@第二种初始化NSURLCache 的方法
// NSURLCache * cache = [[NSURLCache alloc] initWithMemoryCapacity:5 *1024 * 1024
// diskCapacity:25 * 1024 * 1024
// diskPath:nil];//
// [NSURLCache setSharedURLCache:cache];
//
NSURL *url=[NSURL URLWithString:aString];
NSLog(@"%lu",(unsigned long)cache.diskCapacity);//如果没有上面的设置内存缓存就是默认的512K
NSLog(@"%lu",(unsigned long)cache.memoryCapacity);//如果没有上面的设置内存缓存就是默认的10M
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:5.0f];
5.iOS对NSURLRequest提供了7种缓存策略:(实际上能用的只有4种)
NSURLRequestUseProtocolCachePolicy // 默认的缓存策略(取决于协议)
NSURLRequestReloadIgnoringLocalCacheData // 忽略缓存,重新请求
NSURLRequestReloadIgnoringLocalAndRemoteCacheData // 未实现
NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData // 忽略缓存,重新请求
NSURLRequestReturnCacheDataElseLoad// 有缓存就用缓存,没有缓存就重新请求
NSURLRequestReturnCacheDataDontLoad// 有缓存就用缓存,没有缓存就不发请求,当做请求出错处理(用于离线模式)
NSURLRequestReloadRevalidatingCacheData // 未实现
NSCachedURLResponse * response = [cache cachedResponseForRequest:request];
if (response != nil) {
NSLog(@"有缓存");
}else{
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
aBlock(data);
}];
}
http://blog.sina.com.cn/s/blog_71ce775e0101elue.html