UIWebView学习笔记

前几天有朋友问到关于AFNetworking的缓存策略,当时想了想,自己有一点的理解,但是不知道该如何回答,毕竟平时常听到的应该都是关于SDWebImage的一些工作原理,对于AFNetworking的研究不深,后来再网上搜了一下,关于其缓存的策略介绍的文章也不多,后来在墙外搜了一些资料,在此整理如下,供大家参考:

一、关于同一个URL的多次请求

1. iOS 禁用webView加载网页的长按出现’拷贝’事件

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    [self.webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];
    [self.webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout='none';"];
}

How Does Caching Work in AFNetworking? : AFImageCache & NSUrlCache
Explained

  有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的。

2. iOS webView长按图片,不出现’拷贝’(iOS9默认就是这种效果)

AFNetworking实际上使用了两个独立的缓存机制:AFImagecache和NSURLCache.

  必发娱乐官方网站 1

2.1 准备好JS文件

// js文件,如:acepack_details.js
function setImageClickFunction(){
    var imgs = document.getElementsByTagName("img");
    for (var i=0;i<imgs.length;i++){
        imgs[i].style.webkitUserSelect='none';
    }
}

AFImagecache:一个提供图片内存缓存的类,继承自NSCache。

  上面的情况会造成以下问题

2.2 注入JS

[self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"acepack_details" withExtension:@"js"] encoding:NSUTF8StringEncoding error:nil]];

NSURLCache:NSURLConnection’s默认的URL缓存机制,用于存储NSURLResponse对象:一个默认缓存在内存,通过配置可以缓存到磁盘的类。

(1)用户流量的浪费

3. webView作为tableView的tableHeaderView

  • 在webView的回调方法里,一定要重新设置tableView的tableHeaderView,否则会出现意想不到的问题。

-(void)webViewDidFinishLoad:(UIWebView *)webView {
    // 获取到webview的高度
    CGFloat height = [[self.webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight"] floatValue];
    self.webView.frame = CGRectMake(self.webView.frame.origin.x, self.webView.frame.origin.y, ScreenWidth, height);
    // 一定要重新设置tableView的tableHeaderView,否则会出现意想不到的问题。
    [self tableView].tableHeaderView = self.webView;
}

1.AFImagecache

(2)程序响应速度不够快

4. 替换webView中的img标签的图片

  • 应用场景
    • 获取页面中所有图片,图片浏览器
    • 非WIFI环境下,加载本地图片

- (NSString *)replaceImageUrl:(NSString *) content {
    // 匹配<img>标签
    NSString *urlPattern = @"<img[^>]+?src=[\"']?([^>'\"]+)[\"']?";
    NSError *error = [NSError new];
    NSString *tmp = content;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:urlPattern options:NSRegularExpressionCaseInsensitive error:&error ];
    // match 这块内容非常强大
    NSUInteger count =[regex numberOfMatchesInString:content options:NSRegularExpressionCaseInsensitive range:NSMakeRange(0, [content length])];// 匹配到的次数
    UIImage *img = [UIImage imageNamed:@"icon_app"];
    // 用网络图片替换webView上显示的图片
    NSString *tmpStr = @"https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/logo_white_fe6da1ec.png";
    // 用本地图片替换webView上显示的图片
    tmpStr = [self htmlForJPGImage:img];
    if(count > 0) {
        NSArray* matches = [regex matchesInString:content options:NSMatchingReportCompletion range:NSMakeRange(0, [content length])];
        for (NSTextCheckingResult *match in matches) {
            NSInteger count = [match numberOfRanges]; // 匹配项
            for(NSInteger index = 0;index < count;index++){
                NSRange halfRange = [match rangeAtIndex:index];
                if (index == 1) {
                    // 图片的src属性值
                    NSString *urlStr = [content substringWithRange:halfRange];
                    NSLog(@"=%@=",urlStr);
                    // 保存图片URL
                    [self.imgSrcArrayM addObject:[content substringWithRange:halfRange]];
                    // 替换src属性值
                    tmp = [tmp stringByReplacingOccurrencesOfString:urlStr withString: tmpStr];
                }
            }
        }
    }
    return tmp;
}

// 编码图片
- (NSString *)htmlForJPGImage:(UIImage *)image {
    NSData *imageData = UIImageJPEGRepresentation(image,1.0);
    NSString *imageSource = [NSString stringWithFormat:@"data:image/jpg;base64,%@",[imageData base64Encoding]];
    return imageSource;
}

AFImageCache是UIImageView+AFNetworking分类的一部分。它继承自NSCache,通过一个URL字符串作为它的key(从NSURLRequest中获取)来存储UIImage对象。

解决上面的问题,一般考虑对数据进行缓存。

5. webView注入JS代码

[self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"acepack_details" withExtension:@"js"] encoding:NSUTF8StringEncoding error:nil]];

AFImagecache定义:

 

6. webView执行JS代码

// 调用JS里的setImageClickFunction()函数
[self.webView stringByEvaluatingJavaScriptFromString:@"setImageClickFunction()"];

必发娱乐官方网站 2

 二、缓存

7. webView中的图片点击事件

AFImageCache 从 AFNetworking
2.1开始可以进行配置了。有一个公共方法setSharedImageCache。详细文档可以看这里
。它把所有可访问的UIImage对象存到了NSCache。当UIImage对象释放之后NSCache会进行处理。如果你想观察images什么时候释放,可以实现NSCacheDelegate的cache:willEvictObject方法

  为了提高程序的响应速度,可以考虑使用缓存(内存缓存\硬盘缓存)

7.1 准备好JS文件

// js文件,如:acepack_details.js
function setImageClickFunction(){
    // 取出所有的img标签
    var imgs = document.getElementsByTagName("img");
    for (var i=0;i<imgs.length;i++){
        var src = imgs[i].src;
        // 绑定事件
        imgs[i].setAttribute("onClick","clickme(src)");
    }
}

function clickme(imagesrc){
    var url="ClickImage:"+imagesrc;
    document.location = url;
}

2.NSURLCache

  必发娱乐官方网站 3

7.2 注入JS

[self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"acepack_details" withExtension:@"js"] encoding:NSUTF8StringEncoding error:nil]];

既然AFNetworking使用NSURLConnection,它利用了原生的缓存机制NSURLCache。NSURLCache缓存了从服务器返回的NSURLResponse对象。

  第一次请求数据时,内存缓存中没有数据,硬盘缓存中没有数据。

7.3 webView请求回调里,执行JS

// 调用JS里的setImageClickFunction()函数
[self.webView stringByEvaluatingJavaScriptFromString:@"setImageClickFunction()"];

NSURLCache的shareCache方法默认是可以使用的,缓存获取的内容。不幸的是,它的默认配置只是缓存在内存并没有写到硬盘。为了解决这个问题,你可以声明一个
sharedCache,像这样:

缓存数据的过程

7.4 拦截请求,处理图片的单击事件

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)_request navigationType:(UIWebViewNavigationType)navigationType {
    NSString *requestString = [[_request URL] absoluteString];
    NSString *prefix = @"clickimage:";
    if ([requestString hasPrefix:prefix]) {
        DDLogVerbose(@"%@", requestString);
        NSUInteger index = 0;
        NSRange range = [requestString rangeOfString:prefix];
        if (range.location != NSNotFound) {
            NSString *tmpSrc = [requestString substringFromIndex:(range.location + range.length)];
            index = [self.imgSrcArrayM indexOfObject:tmpSrc];
        }
        // 显示图片浏览器
        [self networkImageShow:index];
    }
    return YES;
}

必发娱乐官方网站 4

  必发娱乐官方网站 5

8. 长按webView上的图片,保存

这样,我们声明了一个2M内存,100M磁盘空间的NSURLCache。

当服务器返回数据时,需要做以下步骤

8.1 注入JS

static NSString* const kTouchJavaScriptString=
@"document.ontouchstart=function(event){\
x=event.targetTouches[0].clientX;\
y=event.targetTouches[0].clientY;\
document.location=\"myweb:touch:start:\"+x+\":\"+y;};\
document.ontouchmove=function(event){\
x=event.targetTouches[0].clientX;\
y=event.targetTouches[0].clientY;\
document.location=\"myweb:touch:move:\"+x+\":\"+y;};\
document.ontouchcancel=function(event){\
document.location=\"myweb:touch:cancel\";};\
document.ontouchend=function(event){\
document.location=\"myweb:touch:end\";};";
[self.webView stringByEvaluatingJavaScriptFromString:kTouchJavaScriptString];

对NSURLRequest对象设置缓存策略

(1)使用服务器的数据(比如解析、显示)

8.2 处理点击UIWebView上面的图片

#pragma mark - 处理点击UIWebView上面的图片
- (BOOL)handleWebViewClickImageWithUrl:(NSString *)url{
    NSString *requestString = url;
    NSArray *components = [requestString componentsSeparatedByString:@":"];
    if ([components count] > 1 && [(NSString *)[components objectAtIndex:0]
                                   isEqualToString:@"myweb"]) {
        if([(NSString *)[components objectAtIndex:1] isEqualToString:@"touch"]) {
            //NSLog(@"you are touching!");
            //NSTimeInterval delaytime = Delaytime;
            if ([(NSString *)[components objectAtIndex:2] isEqualToString:@"start"]) {
                /*
                 @需延时判断是否响应页面内的js...
                 */
                _gesState = GESTURE_STATE_START;
                NSLog(@"touch start!");
                float ptX = [[components objectAtIndex:3]floatValue];
                float ptY = [[components objectAtIndex:4]floatValue];
                NSLog(@"touch point (%f, %f)", ptX, ptY);
                NSString *js = [NSString stringWithFormat:@"document.elementFromPoint(%f, %f).tagName", ptX, ptY];
                NSString *tagName = [self.webView stringByEvaluatingJavaScriptFromString:js];
                _imgURL = nil;
                if ([tagName isEqualToString:@"IMG"]) {
                    _imgURL = [NSString stringWithFormat:@"document.elementFromPoint(%f, %f).src", ptX, ptY];
                }
                if (_imgURL) {
                    _timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(handleLongTouch) userInfo:nil repeats:NO];
                }
            }
            else if ([(NSString *)[components objectAtIndex:2] isEqualToString:@"move"])
            {
                //**如果touch动作是滑动,则取消hanleLongTouch动作**//
                _gesState = GESTURE_STATE_MOVE;
                NSLog(@"you are move");
            }
            else if ([(NSString *)[components objectAtIndex:2]isEqualToString:@"end"]) {
                [_timer invalidate];
                _timer = nil;
                _gesState = GESTURE_STATE_END;
                NSLog(@"touch end");
            }
        }
        return NO;
    }
    return YES;
}
// 处理长按事件
- (void)handleLongTouch {
    NSLog(@"%@", _imgURL);
    if (_imgURL && _gesState == GESTURE_STATE_START) {
        UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"保存图片", nil];
        sheet.cancelButtonIndex = sheet.numberOfButtons - 1;
        [sheet showInView:[UIApplication sharedApplication].keyWindow];
    }
}
// 弹出对话框
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    if (actionSheet.numberOfButtons - 1 == buttonIndex) return;
    NSString *title = [actionSheet buttonTitleAtIndex:buttonIndex];
    if ([title isEqualToString:@"保存图片"]) {
        if (_imgURL) {
            NSLog(@"imgurl = %@", _imgURL);
        }
        NSString *urlToSave = [self.webView stringByEvaluatingJavaScriptFromString:_imgURL];
        NSLog(@"image url=%@", urlToSave);
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlToSave]];
        UIImage *image = [UIImage imageWithData:data];
        UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
    }
}
// 回调
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {
    if (error) {
        NSLog(@"Error");
    } else {
        NSLog(@"OK");
    }
}

NSURLCache对每个NSURLRequest对象都会遵守缓存策略(NSURLRequestCachePolicy)。策略定义如下:

(2)将服务器的数据缓存到硬盘(沙盒)

9. webView缓存

NSURLRequestUseProtocolCachePolicy:指定定义在协议实现里的缓存逻辑被用于URL请求。这是URL请求的默认策略

此时缓存的情况是:内存缓存中有数据,硬盘缓存中有数据。

9.1 缓存的意义

  1. webView一般是加载UI比较复杂绚丽、可变、iOS原生控件不容易实现的界面,所以网页的元素一般都很复杂,对处于GPRS环境下的用户而言,流量是个大问题,所以需要缓存!
  2. 当用户处于断网状态下时,为了避免用户进入空白页面,应该把上次已经加载过的页面呈现给用户!
  3. webView的请求一般都是GET,POST请求一般是发大量数据给服务器处理(变动性比较大),因此一般只对GET请求进行缓存,而不对POST请求进行缓存。

NSURLRequestReloadIgnoringLocalCacheData:忽略本地缓存,从源加载

再次请求数据分为两种情况:

9.2 为什么可以进行缓存?

  • NSURLCache在每个UIWebView的的NSURLRequest请求中都会被调用。
  • iOS 5之前:只支持内存缓存;从iOS 5开始:同时支持内存缓存和硬盘缓存。

NSURLRequestReloadIgnoringLocalAndRemoteCacheData:忽略本地&服务器缓存,从源加载

(1)如果程序并没有被关闭,一直在运行

9.3 怎么做到缓存?

  • iOS设备上NSURLCache默认只能进行内存缓存。可以通过子类化NSURLCache来实现自定义的版本从而实现在DISK上缓存内容。
  • 需要重写cachedResponseForRequest,这个会在请求发送前会被调用,从中我们可以判定是否针对此NSURLRequest返回本地数据。
  • 如果本地没有缓存就调用下面这条语句:return [super cachedResponseForRequest:request];

NSURLRequestReturnCacheDataElseLoad:先从缓存加载,如果没有缓存,从源加载

  那么此时内存缓存中有数据,硬盘缓存中有数据。如果此时再次请求数据,直接使用内存缓存中的数据即可

9.4 NSURLCache常用方法

  1. 全局缓存对象

NSURLCache *cache = [NSURLCache sharedURLCache]; 
  1. 设置内存缓存的最大容量(字节为单位,默认为512KB)

-(void)setMemoryCapacity:(NSUInteger)memoryCapacity;
  1. 设置硬盘缓存的最大容量(字节为单位,默认为10M)

-(void)setDiskCapacity:(NSUInteger)diskCapacity;
  1. 取得某个请求的缓存

-(NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request; ```
5. 清除某个请求的缓存
``` objc
-(void)removeCachedResponseForRequest:(NSURLRequest *)request;
  1. 清除所有的缓存

-(void)removeAllCachedResponses;

NSURLRequestReturnCacheDataDontLoad离线模式,加载缓存数据(无论是否过期),不从源加载

(2)如果程序重新启动

9.5 设置NSURLRequest缓存策略

  • NSURLRequestUseProtocolCachePolicy // 默认的缓存策略(取决于协议)
  • NSURLRequestReloadIgnoringLocalCacheData // 忽略缓存,重新请求
  • NSURLRequestReloadIgnoringLocalAndRemoteCacheData // 未实现
  • NSURLRequestReloadIgnoringCacheData =
    NSURLRequestReloadIgnoringLocalCacheData // 忽略缓存,重新请求
  • NSURLRequestReturnCacheDataElseLoad //
    有缓存就用缓存,没有缓存就重新请求
  • NSURLRequestReturnCacheDataDontLoad //
    有缓存就用缓存,没有缓存就不发请求,当做请求出错处理(用于离线模式)
  • NSURLRequestReloadRevalidatingCacheData // 未实现

NSURLRequestReloadRevalidatingCacheData存在的缓存数据先确认有效性,无效的话从源加载

  那么此时内存缓存已经消失,没有数据,硬盘缓存依旧存在,还有数据。如果此时再次请求数据,需要读取内存中缓存的数据。

3.关于网络中的数据缓存

提示:从硬盘缓存中读取数据后,内存缓存中又有数据了

一、关于同一个URL的多次请求

 

有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的。

三、缓存的实现

必发娱乐官方网站 6

1.说明:

上面的情况会造成以下问题

由于GET请求一般用来查询数据,POST请求一般是发大量数据给服务器处理(变动性比较大)

(1)用户流量的浪费

因此一般只对GET请求进行缓存,而不对POST请求进行缓存

(2)程序响应速度不够快

  在iOS中,可以使用NSURLCache类缓存数据

解决上面的问题,一般考虑对数据进行缓存。

  iOS 5之前:只支持内存缓存。从iOS 5开始:同时支持内存缓存和硬盘缓存

二、缓存

 

为了提高程序的响应速度,可以考虑使用缓存(内存缓存\硬盘缓存)

2.NSURLCache

必发娱乐官方网站 7

iOS中得缓存技术用到了NSURLCache类。

第一次请求数据时,内存缓存中没有数据,硬盘缓存中没有数据。

缓存原理:一个NSURLRequest对应一个NSCachedURLResponse

缓存数据的过程

缓存技术:把缓存的数据都保存到数据库中。

必发娱乐官方网站 8

 

当服务器返回数据时,需要做以下步骤

3.NSURLCache的常见用法

(1)使用服务器的数据(比如解析、显示)

(1)获得全局缓存对象(没必要手动创建)NSURLCache *cache = [NSURLCache
sharedURLCache]; 

(2)将服务器的数据缓存到硬盘(沙盒)

(2)设置内存缓存的最大容量(字节为单位,默认为512KB)-
(void)setMemoryCapacity:(NSUInteger)memoryCapacity;

此时缓存的情况是:内存缓存中有数据,硬盘缓存中有数据。

(3)设置硬盘缓存的最大容量(字节为单位,默认为10M)-
(void)setDiskCapacity:(NSUInteger)diskCapacity;

再次请求数据分为两种情况:

(4)硬盘缓存的位置:沙盒/Library/Caches

(1)如果程序并没有被关闭,一直在运行

(5)取得某个请求的缓存- (NSCachedURLResponse
*)cachedResponseForRequest:(NSURLRequest *)request; 

那么此时内存缓存中有数据,硬盘缓存中有数据。如果此时再次请求数据,直接使用内存缓存中的数据即可

(6)清除某个请求的缓存-
(void)removeCachedResponseForRequest:(NSURLRequest *)request;

(2)如果程序重新启动

(7)清除所有的缓存- (void)removeAllCachedResponses;

那么此时内存缓存已经消失,没有数据,硬盘缓存依旧存在,还有数据。如果此时再次请求数据,需要读取内存中缓存的数据。

 

提示:从硬盘缓存中读取数据后,内存缓存中又有数据了

4.缓存GET请求

三、缓存的实现

  要想对某个GET请求进行数据缓存,非常简单

1.说明:

  NSMutableURLRequest *request = [NSMutableURLRequest
requestWithURL:url];

由于GET请求一般用来查询数据,POST请求一般是发大量数据给服务器处理(变动性比较大)

  // 设置缓存策略

因此一般只对GET请求进行缓存,而不对POST请求进行缓存

  request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;

在iOS中,可以使用NSURLCache类缓存数据

  只要设置了缓存策略,系统会自动利用NSURLCache进行数据缓存

iOS 5之前:只支持内存缓存。从iOS 5开始:同时支持内存缓存和硬盘缓存

 

2.NSURLCache

5.iOS对NSURLRequest提供了7种缓存策略:(实际上能用的只有4种)

iOS中得缓存技术用到了NSURLCache类。

NSURLRequestUseProtocolCachePolicy // 默认的缓存策略(取决于协议)

缓存原理:一个NSURLRequest对应一个NSCachedURLResponse

NSURLRequestReloadIgnoringLocalCacheData // 忽略缓存,重新请求

缓存技术:把缓存的数据都保存到数据库中。

NSURLRequestReloadIgnoringLocalAndRemoteCacheData // 未实现

3.NSURLCache的常见用法

NSURLRequestReloadIgnoringCacheData =
NSURLRequestReloadIgnoringLocalCacheData // 忽略缓存,重新请求

(1)获得全局缓存对象(没必要手动创建)NSURLCache *cache = [NSURLCache
sharedURLCache];

NSURLRequestReturnCacheDataElseLoad// 有缓存就用缓存,没有缓存就重新请求

(2)设置内存缓存的最大容量(字节为单位,默认为512KB)-
(void)setMemoryCapacity:(NSUInteger)memoryCapacity;

NSURLRequestReturnCacheDataDontLoad//
有缓存就用缓存,没有缓存就不发请求,当做请求出错处理(用于离线模式)

(3)设置硬盘缓存的最大容量(字节为单位,默认为10M)-
(void)setDiskCapacity:(NSUInteger)diskCapacity;

NSURLRequestReloadRevalidatingCacheData // 未实现

(4)硬盘缓存的位置:沙盒/Library/Caches

 

(5)取得某个请求的缓存- (NSCachedURLResponse
*)cachedResponseForRequest:(NSURLRequest *)request;

6.缓存的注意事项

(6)清除某个请求的缓存-
(void)removeCachedResponseForRequest:(NSURLRequest *)request;

缓存的设置需要根据具体的情况考虑,如果请求某个URL的返回数据:

(7)清除所有的缓存- (void)removeAllCachedResponses;

  (1)经常更新:不能用缓存!比如股票、彩票数据

4.缓存GET请求

  (2)一成不变:果断用缓存

要想对某个GET请求进行数据缓存,非常简单

  (3)偶尔更新:可以定期更改缓存策略 或者 清除缓存

NSMutableURLRequest *request = [NSMutableURLRequest
requestWithURL:url];

提示:如果大量使用缓存,会越积越大,建议定期清除缓存

// 设置缓存策略

 

request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;

四、简单的代码示例

只要设置了缓存策略,系统会自动利用NSURLCache进行数据缓存

必发娱乐官方网站 9

5.iOS对NSURLRequest提供了7种缓存策略:(实际上能用的只有4种)

 1 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 2 {
 3     // 1.创建请求
 4     NSURL *url = [NSURL URLWithString:@"http://127.0.0.1:8080/YYServer/video"];
 5     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
 6     
 7     // 2.设置缓存策略(有缓存就用缓存,没有缓存就重新请求)
 8     request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;
 9     
10     // 3.发送请求
11     [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
12         if (data) {
13             NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
14             
15             NSLog(@"%@", dict);
16         }
17     }];
18 }
19 
20 /**
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  */

NSURLRequestUseProtocolCachePolicy // 默认的缓存策略(取决于协议)

必发娱乐官方网站 10

NSURLRequestReloadIgnoringLocalCacheData // 忽略缓存,重新请求

NSURLRequestReloadIgnoringLocalAndRemoteCacheData // 未实现

NSURLRequestReloadIgnoringCacheData =
NSURLRequestReloadIgnoringLocalCacheData // 忽略缓存,重新请求

NSURLRequestReturnCacheDataElseLoad// 有缓存就用缓存,没有缓存就重新请求

NSURLRequestReturnCacheDataDontLoad//
有缓存就用缓存,没有缓存就不发请求,当做请求出错处理(用于离线模式)

NSURLRequestReloadRevalidatingCacheData // 未实现

6.缓存的注意事项

缓存的设置需要根据具体的情况考虑,如果请求某个URL的返回数据:

(1)经常更新:不能用缓存!比如股票、彩票数据

(2)一成不变:果断用缓存

必发娱乐官方网站,(3)偶尔更新:可以定期更改缓存策略 或者 清除缓存

提示:如果大量使用缓存,会越积越大,建议定期清除缓存

简单示例:

必发娱乐官方网站 11

原文地址:

相关文章