缓存

参考:

  1. iOS开发网络篇
  2. NSCache缓存类的详解
    3.H5缓存机制浅析-移动端Web加载性能优化【干货】
    4.OKHTTP之缓存配置详解

缓存 一般用于get

NSURLCache 和 NSCache 的区别

  1. NSURLCache提供的是URL Request缓存,可以在Memory和Disk上;NSCache提供了HTTP Request外的东西的缓存方式,在Memory上。
  2. NSCache和NSDictionary类似,不同的是系统回收内存的时候它会自动删掉它的内容.AFNetworking的图片缓存采用的就是NSCache。
  3. 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来请求新的数据。

你可能感兴趣的:(缓存)