1、html的缓存主要採取ASIHTTPRequest的缓存策略

(1)、设置缓存策略

    //设置缓存
ASIDownloadCache *cache=[[ASIDownloadCache alloc] init];
self.myCache=cache;
//设置缓存路径
NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString *documentDirectory = [paths objectAtIndex:0];
//设置缓存存放路径
[self.myCache setStoragePath:[documentDirectory stringByAppendingPathComponent:@"resource"]];
//ASIAskServerIfModifiedCachePolicy 与默认缓存大致一样。差别仅是每次请求都会 去server推断是否有更新
//ASIOnlyLoadIfNotCachedCachePolicy 假设有缓存在本地,无论其过期与否。总会拿来使用
//ASIFallbackToCacheIfLoadFailsCachePolicy 这个选项常常被用来与其他选项组合使用。请求失败时,假设有缓存当网络则返回本地缓存信息
[self.myCache setDefaultCachePolicy:ASIFallbackToCacheIfLoadFailsCachePolicy]; //设置缓存策略

(2)、设置异步缓存

   NSURL *Requesturl=[NSURL URLWithString:url];
ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:Requesturl];
// //获取全局变量
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
// //设置缓存方式
[request setDownloadCache:appDelegate.myCache];
// //设置缓存数据存储策略。这里採取的是假设无更新或无法联网就读取缓存数据
[request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
[request setDelegate:self];
[request startAsynchronous];

html缓存完毕。如想查看具体 请点击 : IOS开发网络篇之──ASIHTTPRequest具体解释

2、html中的图片缓存

(1)、通过正则获取html代码中的全部图片url

  NSString *urlPattern = @"<img[^>]+?

src=[\"']?

([^>'\"]+)[\"']?

";
NSError *error = [NSError new]; NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:urlPattern options:NSRegularExpressionCaseInsensitive error:&error ]; //match 这块内容很强大
NSUInteger counts =[regex numberOfMatchesInString:content options:NSRegularExpressionCaseInsensitive range:NSMakeRange(0, [content length])];//匹配到的次数
if(counts > 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) {
//[listImage addObject:[content substringWithRange:halfRange]];
NSLog(@"转换出来的字符串===%@",[content substringWithRange:halfRange]);
[listImage addObject:[content substringWithRange:halfRange]];
}
}
}//遍历后能够看到三个range。1、为总体。 2、为([\\w-]+\\.)匹配到的内容。3、([\\w.%&=-]*)匹配到的内容
}

(2)、SDwebImage下载图片 、JS交互替换

 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
dispatch_group_t group = dispatch_group_create();
for (int i = 0; i < listImage.count; i++)
{
NSString *imageUrl = [imageUrlArray objectAtIndex:i];
NSString *key=[self getMd5_32Bit_String:imageUrl];
UIImage *cachedImage=[[SDImageCache sharedImageCache] imageFromDiskCacheForKey:key];
NSString *index = [NSString stringWithFormat:@"%d", i]; if (cachedImage) { [tchWebView stringByEvaluatingJavaScriptFromString:[self createSetImageUrlJavaScript:index
imgUrl:key]];
}else{ dispatch_group_async(group, queue, ^{
//异步下载图片
[SDWebImageDownloader.sharedDownloader downloadImageWithURL:[NSURL URLWithString:imageUrl]
options:0
progress:^(NSInteger receivedSize, NSInteger expectedSize)
{
// progression tracking code
}
completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished)
{
if (image && finished)
{
[[SDImageCache sharedImageCache] storeImage:image forKey:key];
dispatch_sync(dispatch_get_main_queue(), ^{
[tchWebView stringByEvaluatingJavaScriptFromString:[self createSetImageUrlJavaScript:index
imgUrl:key]];
});
}
}]; });
}
}
dispatch_release(group);
//设置下载完毕的图片到web img
- (NSString *)createSetImageUrlJavaScript:(NSString *) index imgUrl:(NSString *) url{
UIImage *myCachaImage=[[SDImageCache sharedImageCache] imageFromDiskCacheForKey:url];
NSData *imageData = UIImageJPEGRepresentation(myCachaImage,1.0);
NSString *imageSource = [NSString stringWithFormat:@"data:image/jpg;base64,%@",[imageData base64Encoding]]; NSString *js = [NSString stringWithFormat:@"var imgArray = document.getElementsByTagName('img'); imgArray[%@].src=\"%@\"; " , index, imageSource];
return js;
}
//32位MD5加密方式
- (NSString *)getMd5_32Bit_String:(NSString *)srcString{
const char *cStr = [srcString UTF8String];
unsigned char digest[CC_MD5_DIGEST_LENGTH];
CC_MD5( cStr, strlen(cStr), digest );
NSMutableString *result = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
[result appendFormat:@"%02x", digest[i]]; return result;
}

參考:http://bbs.csdn.net/topics/390831054

UIwebView实现html的离线缓存的更多相关文章

  1. uiwebview 离线缓存 图片

    uiwebview 离线缓存图片

  2. HTML5离线缓存(Application Cache)

    HTML5离线缓存又名Application Cache,是从浏览器的缓存中分出来的一块缓存区,要想在这个缓存中保存数据,可以使用一个描述文件(manifest file),列出要下载和缓存的资源. ...

  3. HTML5 离线缓存管理库

    一.HTML5离线缓存技术 支持离线缓存是HTML5中的一个重点,离线缓存就是让用户即使在断网的情况下依然可以正常的运行应用.传统的本地存储数据的方式有 localstorage,sessionsto ...

  4. HTML5离线缓存问题

    HTML5离线缓存问题 1.应用程序缓存 什么是应用程序缓存(Application Cache)? HTML5 引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问. ...

  5. HTML5离线缓存

    参考文档:http://www.w3cschool.cc/html/html5-app-cache.html HTML5 应用程序缓存 又称离线缓存 ,即使断线了,刷新后也还是缓存了原来的页面,不会4 ...

  6. Html5离线缓存详细讲解

    离线缓存是Html5新特性之一,简单理解就是第一次加载后将数据缓存,在没有清除缓存前提下,下一次没有网络也可以加载,用在静态数据的网页或游戏比较好用.当然,Html5新的特性都不是所有浏览器都能支持的 ...

  7. 使用html5的离线缓存技术

    突然想用html5的离线缓存,但是一直没有成功,在各种群里问发现很多人都没什么经验,最终终于在各种论坛找到解决方案了.下面就简单记录一下相关情况. 一.离线缓存的优点 我们都知道离线缓存主要是用来减少 ...

  8. 使用 jQuery Mobile 与 HTML5 开发 Web App —— HTML5 离线缓存

    本文要介绍的,是 HTML5 离线网络应用程序的特性,离线网络应用程序在 W3C 中的实际名称是 "Offline Web applications" ,也称离线缓存.当用户打开浏 ...

  9. HTML5 manifest离线缓存

    一.基本概念 离线缓存是HTML5新引入的技术,能够让你的Web应用程序指定哪些文件可以缓存在本地,使得你的网络断开时依然可以通过本地的缓存来进行访问浏览. 二.使用方法 1. MIME type 声 ...

随机推荐

  1. iOS oc 中的闭包

    //闭包 NSString* s =@"123"; void (^block)() = ^() { NSLog(@"%@",s); }; block();// ...

  2. DM8168 环境搭建(2) ------ 虐心之旅

    续上  ... ... ... (5)安装minicom minicom类似于windows下的超级终端,用于与串口设备通信    参考命令:sudo apt-get install minicom ...

  3. ACM俱乐部算法基础练习赛(1)

    A: 水题 代码: #include<cstdio> #include<algorithm> using namespace std; ]; int n,m,c; int ma ...

  4. django celery redis简单测试

    希望在下一版中,能用这个小芹菜,来实现异步的多任务并行哈. 安装REDIS之类的不表,只说在DJANGO当中要注意配置的事项. 0,安装插件 yum install redis-server pip ...

  5. layer.js:2 Uncaught TypeError: Cannot read property 'extend' of undefined

    在引用layer.js插件进行前端编程的时候,如果报这个错,解决办法只需: 把layer的引用放在有冲突的js库前面就行了

  6. 【HDU 2855】 Fibonacci Check-up (矩阵乘法)

    Fibonacci Check-up Problem Description Every ALPC has his own alpc-number just like alpc12, alpc55, ...

  7. vlc

    源码下载地址:http://download.videolan.org/pub/videolan/vlc/ 编译依赖: sudo apt-get install liblua5.2-dev sudo ...

  8. USB OTG

    OTG检测的原理是:USB OTG标准在完全兼容USB2.0标准的基础上,增添了电源管理(节省功耗)功能,它允许设备既可作为主机,也可作为外设操作(两用OTG).USB OTG技术可实现没有主机时设备 ...

  9. 基于Delphi的Socket I/O模型全接触 good

    老陈有一个在外地工作的女儿,不能经常回来,老陈和她通过信件联系.他们的信会被邮递员投递到他们的信箱里. 这和Socket模型非常类似.下面我就以老陈接收信件为例讲解Socket I/O模型. 一:se ...

  10. windows下安装php真正的多线程扩展pthreads教程

    扩展地址:http://docs.php.net/manual/zh/book.pthreads.php 注意事项php5.3或以上,且为线程安全版本.apache和php使用的编译器必须一致.通过p ...