美文网首页
NSURLCache

NSURLCache

作者: mkb2 | 来源:发表于2017-03-18 17:27 被阅读50次

缘由

前一段时间去仿写SDWebImage的时候,就遇到这SDCacheNSURLCache,然后在类中还有地做了一切判断,当时找了一些相关文章看,但是没有特别理解网络层,对NSURLCacheNSCacheETagLast-Modified表示很模糊;

这几天正在阅读AFNetworking的源码,然后不得不又遇到这个NSURLCache,硬着头皮又看了一边之前的文章,又是云里雾里,好在跟着博客写了一个demo,算是理解~


NSURLCache和NSCache有关系吗?

没有,前者是给url做缓存的,可以有内存缓存,也可以有磁盘缓存;后者是对文件缓存,保存到内存中


NSURLCache的使用

普遍来说,这个功能非常强大,两句代码就可以做缓存;

//在整个方法中写
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    NSURLCache *urlCache = [[NSURLCache alloc] initWithMemoryCapacity:4*1024*1024 diskCapacity:20*1024*1024 diskPath:nil];
    [NSURLCache setSharedURLCache:urlCache];
    return YES;
}

AFNetworking的作者非常推荐这样使用
并且,AFN的demo中就这样写的,直接作为缓存使用!!!

但是,我们只是缓存了,没有使用缓存!!!这个一定要明确,因为,我们没有每一次发送请求的时候,都没有使用ETag或者Last-Modified字段,所以,以后对同一个url做请求,只是做了缓存,但是没有利用缓存;


如何使用url的内存缓存?如何优化自己的网络请求?

说到这里,首先了解一下什么是ETagLast-Modified:
1.ETag是内容摘要,就是内容的MD5,然后和后台比对;在request对应的字段是If-None-Match
2.Last-Modified 是文件上一次修改的时间,但是比较的时候,用!=,因为有可能后台的文件回退,导致了我们前台发送的时间大约后台的文件修改时间,这个可能经常发生,所以要去处理使用!=; 在request对应的字段是If-Modified-Since;

    self.imageView.image = nil;
    NSURL *url = [NSURL URLWithString:kETagImageURL];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url
                                                                cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:15.0];
    NSLog(@"看看If-Modified-Since  = %@",self.localLastModified);
    if (self.localLastModified.length>0) {
        [request setValue:self.localLastModified forHTTPHeaderField:@"If-Modified-Since"];
    }
    NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
        if (httpResponse.statusCode == 304) {
            //没改变
            NSCachedURLResponse *cachedResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:request];
            data =  cachedResponse.data;
            NSLog(@"走了304");
        }else{
            NSLog(@"走了200");
            //保存last_modified
            self.localLastModified = httpResponse.allHeaderFields[@"Last-Modified"];
            NSLog(@"收到的reponse 修改时间%@",httpResponse.allHeaderFields[@"Last-Modified"]);
        }
        if (data) {
            UIImage *image = [[UIImage alloc] initWithData:data];
            self.imageView.image = image;
        }
        
    }];
    [task resume];

参考文章:
1.使用80%的代码来完成剩下的20%的缓存需求
2.NSCache和NSURLCache、网络缓存优化

相关文章

  • NSURLCache官方文档阅读

    NSURLCache Overview NSURLCache类通过将NSURLRequest对象映射到NSCach...

  • [iOS-Foundation] Networking Cach

    NSHipster-NSURLCache NSURLCache 通过保存NSURLRequest对象和其相应的NS...

  • iOS网络请求缓存 - NSURLCache

    NSURLCache NSURLCache为应用程序的URL请求提供复合的内存和磁盘缓存机制。作为Foundati...

  • NSCache & NSDictionary &

    NSCache和NSURLCache一点关系也没有 NSCache和NSURLCache一点关系也没有 NSURL...

  • NSURLCache

    NSURLCache 为应用的 URL 请求提供了内存以及磁盘上的缓存。当一个请求完成下载来自服务器的回应,一个缓...

  • NSURLCache

    cache1、afnetworking默认的NSURLSessionConfiguration 2、系统默认的NS...

  • NSURLCache

    概述 NSURLCache类通过将NSURLRequest对象映射到NSCached URLResponse对象来...

  • NSURLCache

    NSURLCache FrameworkFoundation SDKsiOS 8.0+macOS 10.10+tv...

  • NSURLCache

    NSURLCache为你的url请求提供了内存以及磁盘上的综合缓存机制。使用缓存可以减少向服务发送请求的次数,同时...

  • NSURLCache

    缘由 前一段时间去仿写SDWebImage的时候,就遇到这SDCache和NSURLCache,然后在类中还有地做...

网友评论

      本文标题:NSURLCache

      本文链接:https://www.haomeiwen.com/subject/yusunttx.html