NSURLCache缓存使用简介

一、需求

1.在IOS应用程序开发中,为了减少与服务端的交互次数,加快用户的响应速度,一般都会在IOS设备中加一个缓存的机制。使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,是程序高效的运行。有时候我们需要将远程web服务器获取的数据缓存起来,减少对同一个url多次请求。使用sdk中的NSURLCache类,可以很方便的实现此功能。
2.NSURLCache可以做到完全的离线缓存,即在没有网络的情况下打开离线内容通过自定义的实现,将缓存文件存放到沙盒路径下,缓存空间没有大小限制可以借鉴H5离线缓存中的Manifest文件,来定义缓存策略。Manifest文件从服务器端下载下来,在本地做版本对比,来实现存储和更新。
3. NSURLCache拦截不到WKWebView中发出的任何网络请求。所以如果使用WKWebView的话,NSURLCache实现不了离线缓存的功能。

二、一般使用场景

1.NSURLRequest需要一个缓存策略参数来说明它请求的url何如缓存数据的:CachePolicy类型。
(1)NSURLRequestUseProtocolCachePolicy:NSURLRequest默认的cache policy,使用Protocol协议定义。
(2)NSURLRequestReloadIgnoringCacheData:忽略缓存直接从原始地址下载。
(3)NSURLRequestReturnCacheDataElseLoad:只有在cache中不存在data时才从原始地址下载。
(4)NSURLRequestReturnCacheDataDontLoad:只使用cache数据,如果不存在cache,请求失败;用于没有建立网络连接离线模式;
(5)NSURLRequestReloadIgnoringLocalAndRemoteCacheData:忽略本地和远程的缓存数据,直接从原始地址下载,与NSURLRequestReloadIgnoringCacheData类似。 
(6)NSURLRequestReloadRevalidatingCacheData:验证本地数据与远程数据是否相同,如果不同则下载远程数据,否则使用本地数据。
(7)说明:5和6苹果暂未实现。

2.首先我们需要在发送请求之前设置一下缓存大小:
(1)默认情况下,内存是4M,4* 1024 * 1024;硬盘为20M,20 * 1024 * 1024;
  [[NSURLCache sharedURLCache] setMemoryCapacity:4*1024*1024]。
  [[NSURLCache sharedURLCache] setDiskCapacity:20*1024*1024]。 
(2)也可以自己初始化缓存对象:
  NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:4*1024*1024 diskCapacity:20*1024*1024 diskPath:path];
  [NSURLCache setSharedURLCache:URLCache];

3.控制需不需要缓存:
NSURLConnectionDataDelegate代理方法中,下面的方法用来指定此次请求需不需要缓存,同时也可以在返回之前,修改response里面的数据:
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse

三、要点:

1.UIWebView的的NSURLRequest请求,以及自己用NSURLConnection发送的请求,NSURLCache都会拦截并存储。
2.NSURLCache只对异步请求有效。
3.NSURLCache的缓存包括内存缓存和磁盘缓存,iOS4.x系统只有内存缓存,iOS5.x及以上两者都有,但仅支持HTTP,HTTPS在iOS6中增加了支持。磁盘缓存有默认的缓存路径,也可以自己指定路径。
4.当系统存储空间不足时,当前的请求不会被缓存,包括之前的磁盘缓存也可能被系统清除掉。
5.如果有使用NSURLCache,在应用收到内存警告时,应该清空缓存:removeAllCachedResponses。

四:NSURLCache相关API:

1.功能方法:
(1)- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request;
返回对应的NSURLRequest缓存的response,如果没有则返回nil。
(2)- (void)storeCachedResponse:(NSCachedURLResponse *)cachedResponse forRequest:(NSURLRequest *)request;
为特定的NSURLRequest指定缓存对象,并存储。
(3)- (void)removeCachedResponseForRequest:(NSURLRequest *)request;  
移除特定NSURLRequest的cache。
(4)- (void)removeAllCachedResponses;
移除所有的cache。
 
2.property方法
- (NSUInteger)memoryCapacity;
- (NSUInteger)diskCapacity;
- (void)setMemoryCapacity:(NSUInteger)memoryCapacity;
- (void)setDiskCapacity:(NSUInteger)diskCapacity;
- (NSUInteger)currentMemoryUsage;
- (NSUInteger)currentDiskUsage;

五、NSCachedURLResponse对象:包装了一下系统缓存机制的对象,保持了缓存对象的个性和特性。

1. NSURLCacheStoragePolicy 缓存策略有三种
enum
{
    NSURLCacheStorageAllowed,
    NSURLCacheStorageAllowedInMemoryOnly,
    NSURLCacheStorageNotAllowed,
};
 
2. 构造方法
- (id)initWithResponse:(NSURLResponse *)response data:(NSData *)data;
- (id)initWithResponse:(NSURLResponse *)response data:(NSData *)data userInfo:(NSDictionary *)userInfo storagePolicy:(NSURLCacheStoragePolicy)storagePolicy;
 
3. 相关API
- (NSURLResponse *)response;
- (NSData *)data;
- (NSDictionary *)userInfo;
- (NSURLCacheStoragePolicy)storagePolicy;

六、自定义NSURLCache

在一些特殊场景,如果要实现自定义的缓存机制,需要子类化NSURLCache
1.重写cachedResponseForRequest:(NSURLRequest *)request,这个会在请求发送前会被调用,从中我们可以判定是否针对此NSURLRequest返回本地数据。如果本地没有缓存就调用下面这条语句:return [super cachedResponseForRequest:request];
2.重写storeCachedResponse:(NSCachedURLResponse *)cachedResponse forRequest:(NSURLRequest *)request,我们可以对某一个请求做我们自己的数据保存机制,如果使用系统默认的数据保存机制,则调用[super storeCachedResponse:cachedResponse forRequest:request];

七、自定义NSURLCache简单示例:

- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request{

    //获取URL整体路径

    NSString *urlStringMD5 = [self md5:request.URL.absoluteString];

    

    //获取缓存文件存储地址

    NSString *filePath = [[self getDocumentPath] stringByAppendingPathComponent:urlStringMD5];

    

    //如果缓存存在,则返回缓存数据,否则使用系统默认处理

    if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {

        //获取缓存文件路径

        NSData *fileData = [[NSData alloc] initWithContentsOfFile:filePath];

        //根据URL路径,获取媒体类型

        NSString *memiType = [self mimeTypeForPath:request.URL.absoluteString];

        //合成NSCachedURLResponse对象,返回

        NSURLResponse *response = [[NSURLResponse alloc] initWithURL:[request URL]

                                                            MIMEType:memiType

                                               expectedContentLength:[fileData length]

                                                    textEncodingName:nil];

        NSCachedURLResponse *cachedResponse = [[NSCachedURLResponse alloc] initWithResponse:response data:fileData];

        return cachedResponse;

    }else{

        return [super cachedResponseForRequest:request];

    }

}


- (void)storeCachedResponse:(NSCachedURLResponse *)cachedResponse forRequest:(NSURLRequest *)request{

    //将服务器返回数据缓存起来

    NSString *urlStringMD5 = [self md5:request.URL.absoluteString];

    NSString *filePath = [[self getDocumentPath] stringByAppendingPathComponent:urlStringMD5];

    [cachedResponse.data writeToFile:filePath atomically:YES];

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

获取GIF图片中所有的单图

一、场景需求iOS系统中不支持flash,所以gif图片无法播放。需要将gif中的所有单图拿出来,自己来实现轮播动画。ImageIO框架中提供了获取gif图片中所有单图的相关API。二、使用简介1.首先根据gif图片文件初始化CGImageSourceRef:CFDataRef可以通…

回头看看NSURLConnection

一、基础代理1.使用场景&#xff1a;网络错误提示&#xff0c;以及证书使用控制。2.协议内容protocol NSURLConnectionDelegate <NSObject>optional- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;- (BOOL)connectionShouldUseCre…

生成同时兼容iOS真机和模拟器的.a包

一、步骤&#xff1a;1.首先分别生成模拟器架构和真机架构的.a包&#xff0c;然后在合并。2.使用命令&#xff1a;lipo -create 模拟器架构.a 真机架构.a -output 兼容架构.a3.其它有用的功能&#xff1a;&#xff08;1&#xff09;查看某一个.a包都支持什么架构&#xff1a;li…

iOS的事件分发

移动平台上的开发主要关注数据以及数据的处理&#xff0c;事件的处理以及UI。所以事件的分发处理是很重要的一个环节&#xff0c;对于一个平台的优劣来说也是一项重要的参数。如果事件的分发设计的不好&#xff0c;一些复杂的UI场景就会变得很难写甚至没法写。从小屏没有触摸的…

iOS开发ARC入门和使用

本文部分实例取自iOS 5 Toturail一书中关于ARC的教程和公开内容&#xff0c;仅用于技术交流和讨论。请不要将本文的部分或全部内容用于商用&#xff0c;谢谢合作。 欢迎转载本文&#xff0c;但是转载请注明本文出处&#xff1a;http://www.onevcat.com/2012/06/arc-hand-by-han…

UIBezierPath 的使用介绍

使用UIBezierPath类可以创建基于矢量的路径。此类是Core Graphics框架关于path的一个封装。使用此类可以定义简单的形状&#xff0c;如椭圆或者矩形&#xff0c;或者有多个直线和曲线段组成的形状。1.Bezier Path 基础UIBezierPath对象是CGPathRef数据类型的封装。path如果是基…

iOS中的XML解析

解析方式分类: 解析 XML 通常有两种方式&#xff0c;DOM 和 SAX&#xff1a;DOM解析XML时&#xff0c;读入整个XML文档并构建一个驻留内存的树结构&#xff08;节点树&#xff09;&#xff0c;通过遍历树结构可以检索任意XML节点&#xff0c;读取它的属性和值。 iOS中XML解析是…

iOS中的JSON解析

一、在iOS中&#xff0c;JSON的常见解析方案有4种&#xff08;1&#xff09;第三方框架&#xff1a;JSONKit、SBJson、TouchJSON&#xff08;性能从左到右&#xff0c;越差&#xff09; &#xff08;2&#xff09;苹果原生&#xff08;自带&#xff09;&#xff1a;NSJSONSeria…

iOS中NSLog的优化使用

一、概述&#xff1a;Debug模式下输出日志&#xff0c;Release模式下自动屏蔽日志输出。通过宏定义实现。二、代码如下&#xff1a;#ifndef __OPTIMIZE__ #define DLog(fmt, ...) NSLog(("%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) #else…

iOS中bundle的使用

一、概述1.在我们使用第三方框架时&#xff0c;常常看到XXX.bundle的文件。我们找到该文件&#xff0c;显示包内容&#xff0c;大致看到很多资源文件&#xff1a;图片、配置文本、XIB文件……2.什么是Bundle文件&#xff1a;简单理解&#xff0c;就是资源文件包。我们将许多图片…

NSRunloop小总结

一、概述1.Run loops是线程的基础架构部分。一个run loop就是一个事件处理循环&#xff0c;用来不停的调配工作以及处理输入事件。使用run loop的目的是使你的线程在有工作的时候工作&#xff0c;没有的时候休眠。2.Run loop的管理并不完全是自动的。你仍必须设计你的线程代码以…

NSURLProtocol概述

一、概念 NSURLProtocol也是苹果众多黑魔法中的一种&#xff0c;使用它可以轻松地重定义整个URL Loading System。当你注册自定义NSURLProtocol后&#xff0c;就有机会对所有的请求进行统一的处理&#xff0c;基于这一点它可以让你&#xff1a; 1.自定义请求和响应 2.提供自定义…

使用NSURLProtocol实现离线缓存

一、说明&#xff1a;NSURLProtocol可以拦截任何网络请求&#xff0c;包含UIWebView中发出的所有请求。但是在WKWebView中&#xff0c;只能拦截到最初始的请求&#xff0c;内嵌的资源下载拦截不到。比如通过WKWebView加载"http://www.baidu.com",则只能拦截到"h…

WKWebView概述

一、概述1.iOS 8 SDK中发布了新的WebView框架----WebKit.framework。2.WebKit使用WKWebView来代替IOS的UIWebView和OSX的NSWebView&#xff0c;并且使用Nitro JavaScript引擎&#xff0c;这意味着所有第三方浏览器运行JavaScript将会跟safari一样快。3.内存问题&#xff1a;(1)…

CoreData 自定义数据类型

在CoreData中&#xff0c;Entity中Attribute的类型只有固定的几种可选。如下图&#xff1a; 如果我们要想直接存放UIImage到数据库&#xff0c;如何做&#xff1f; 1.在coredata中新建的attribute中类形选择Transformable. 意思表示这个字段是自定义的类型。 2.在生成的NSMana…

XMLDictionary iOS的XML处理包

1.概述&#xff1a;XMLDictionary 提供一种简单的方法实现 iOS 和 Mac OS X 下解析和生成 XML 的方法。XMLDictionary 将 XML 转成 NSDictionary ,也可以将 NSDictionary 装成 XML 结构的字符串。2.实现原理&#xff1a;XMLDictionary 使用 NSXMLParser 类解析XML&#xff0c;使…

CoreData并发操作模式简介

iOS5.0中&#xff0c;苹果为CoreData的并发处理添加了两个内容。一、首先介绍第一个内容&#xff1a;CoreData框架中的NSManagedObjectContext类增加新的初始化方法&#xff1a;initWithConcurrencyType:(NSManagedObjectContextConcurrencyType)ct;1.参数方法介绍&#xff1a;…

java图片的导出,并压缩

java图片的导出,并压缩 java 压缩包jar包使用的是commons-compress-1.6.jar /*** 导出图片* param request* param response*/RequestMapping("/exportPicture")public void exportPicture(HttpServletRequest request,HttpServletResponse response) throws Exce…

【Linux系统基础】(3)在Linux上部署运维监控Zabbix和Grafana

目录 运维监控Zabbix部署简介安装安装前准备 - Mysql安装Zabbix Server 和 Zabbix Agenta. 安装Zabbix yum库b. 安装Zabbix Server、前端、Agentc. 初始化Mysql数据库d. 为Zabbix Server配置数据库e. 配置Zabbix的PHP前端 配置zabbix 前端&#xff08;WEB UI&#xff09; 运维监…

Pods简介

每种语言发展到一个阶段&#xff0c;就会出现相应的依赖管理工具&#xff0c;例如 Java 语言的 Maven&#xff0c;nodejs 的 npm。随着 iOS 开发者的增多&#xff0c;业界也出现了为 iOS 程序提供依赖管理的工具&#xff0c;它的名字叫做&#xff1a;CocoaPods。 CocoaPods项目…