导航网站搭建,镜像的网站怎么做排名,快速seo关键词优化技巧,wordpress主题不见了一、需求1.在IOS应用程序开发中#xff0c;为了减少与服务端的交互次数#xff0c;加快用户的响应速度#xff0c;一般都会在IOS设备中加一个缓存的机制。使用缓存的目的是为了使用的应用程序能更快速的响应用户输入#xff0c;是程序高效的运行。有时候我们需要将远程web服…一、需求1.在IOS应用程序开发中为了减少与服务端的交互次数加快用户的响应速度一般都会在IOS设备中加一个缓存的机制。使用缓存的目的是为了使用的应用程序能更快速的响应用户输入是程序高效的运行。有时候我们需要将远程web服务器获取的数据缓存起来减少对同一个url多次请求。使用sdk中的NSURLCache类可以很方便的实现此功能。2.NSURLCache可以做到完全的离线缓存即在没有网络的情况下打开离线内容。通过自定义的实现将缓存文件存放到沙盒路径下缓存空间没有大小限制。可以借鉴H5离线缓存中的Manifest文件来定义缓存策略。Manifest文件从服务器端下载下来在本地做版本对比来实现存储和更新。3. NSURLCache拦截不到WKWebView中发出的任何网络请求。所以如果使用WKWebView的话NSURLCache实现不了离线缓存的功能。二、一般使用场景1.NSURLRequest需要一个缓存策略参数来说明它请求的url何如缓存数据的CachePolicy类型。(1)NSURLRequestUseProtocolCachePolicyNSURLRequest默认的cache policy使用Protocol协议定义。(2)NSURLRequestReloadIgnoringCacheData忽略缓存直接从原始地址下载。(3)NSURLRequestReturnCacheDataElseLoad只有在cache中不存在data时才从原始地址下载。(4)NSURLRequestReturnCacheDataDontLoad只使用cache数据如果不存在cache请求失败;用于没有建立网络连接离线模式;(5)NSURLRequestReloadIgnoringLocalAndRemoteCacheData忽略本地和远程的缓存数据直接从原始地址下载与NSURLRequestReloadIgnoringCacheData类似。 (6)NSURLRequestReloadRevalidatingCacheData:验证本地数据与远程数据是否相同如果不同则下载远程数据否则使用本地数据。(7)说明5和6苹果暂未实现。2.首先我们需要在发送请求之前设置一下缓存大小(1)默认情况下内存是4M4* 1024 * 1024硬盘为20M20 * 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及以上两者都有但仅支持HTTPHTTPS在iOS6中增加了支持。磁盘缓存有默认的缓存路径也可以自己指定路径。4.当系统存储空间不足时当前的请求不会被缓存包括之前的磁盘缓存也可能被系统清除掉。5.如果有使用NSURLCache在应用收到内存警告时应该清空缓存removeAllCachedResponses。四NSURLCache相关API1.功能方法(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]; }