参考:
缓存 一般用于get
NSURLCache 和 NSCache 的区别
- NSURLCache提供的是URL Request缓存,可以在Memory和Disk上;NSCache提供了HTTP Request外的东西的缓存方式,在Memory上。
- NSCache和NSDictionary类似,不同的是系统回收内存的时候它会自动删掉它的内容.AFNetworking的图片缓存采用的就是NSCache。
- NSURLCache一般用于UIWebView,只对异步请求有效,程序中只有一个NSURLCache,为了使响应更灵敏而且更像本地用户界面。
1. NSURLCache本地缓存
1.首先设置urlcache
NSURLCache *cache = [NSURLCache sharedURLCache];//全局就只有这一个cache
[cache setMemoryCapacity:100 * 1024 * 1024];//设置内存
[cache setDiskCapacity:100 * 1024 * 1024];//设置磁盘
[NSURLCache setSharedURLCache:cache];//同步
2.创建请求。
NSURL *url = [NSURL URLWithString:@"http://o0o0o0o.iteye.com/images/sina.jpg"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 2.设置缓存策略(有缓存就用缓存,没有缓存就重新请求)
request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;
3.发送请求
//第一次请求会缓存到内存和本地,以后直接返回结构,不会再去请求
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (data) {
NSLog(@"fddfd");//只会打印一次
}
}];
[task resume];
4.webView缓存
同样是设置request为可缓存策略即可
5.缓存其他方法
/**
21 // 定期处理缓存
22 // if (缓存没有达到7天) {
23 // request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;
24 // }
25 // 获得全局的缓存对象
26 NSURLCache *cache = [NSURLCache sharedURLCache];
27 // if (缓存达到7天) {
28 // [cache removeCachedResponseForRequest:request];
29 // }
30
31 // lastCacheDate = 2014-06-30 11:04:30
32
33 NSCachedURLResponse *response = [cache cachedResponseForRequest:request];
34 if (response) {
35 NSLog(@"---这个请求已经存在缓存");
36 } else {
37 NSLog(@"---这个请求没有缓存");
38 }
39 */
缓存文件:要放在library/cache中,这个文件不会同步到icloud中.
缓存的逻辑:在viewWillAppear中应该拿到数据展示出来,然后请求最新的数据,如果成功,显示最新数据,失败则就还是展示的缓存数据,并提示加载失败。在viewWillDisappear中应该将此时展示的数据写入本地。当加载首页数据失败,还要考虑,要不要上拉加载更多,如果等保证数据不会重复,则可以上拉加载,如果数据可能会重复,则我们要禁止上拉加载更多,可以将page 设置为首页减1,然后结束刷新的时候判断,page是不是首页减1,是的话隐藏footer。
如何保证上拉加载数据不重复:可以使用最后一条消息的id来请求新的数据。