hybrid应用中,缓存处理是比较棘手的。 objective-c有缓存的类NSURLCache,官方给出的解释是: It provides a composite in-memory and on-disk cache。也就是说,当应用关闭后,缓存就失效了。为了使不
hybrid应用中,缓存处理是比较棘手的。
objective-c有缓存的类NSURLCache,官方给出的解释是:It provides a composite in-memory and on-disk cache。也就是说,当应用关闭后,缓存就失效了。为了使不经常变动的数据能持久化存储,需要自己来实现。
思路:
UIWebview每请求一个URL,便将页面及其对应数据存储到本地。当用户再次请求该数据时,直接加载disk里的数据。
方案:
1、第一次请求URL时,将HTML文件存到本地;并对该文件解析,找出js、css、图片的链接,也下载到本地;把HTML文件中图片等资源的链接替换成本地路径。
如示例中链接中包含如下的链接:
<link href="/IosMoive/Content/bootstrap/css/bootstrap-min.css" rel="stylesheet"> <link href="/IosMoive/Content/Bootstrap/css/bootstrap-theme-min.css" rel="stylesheet"> <script src="/IosMoive/Content/Scripts/jquery2.js"></script> <img src="/IosMoive/Content/Images/m_ico_support_order.png"> <img src="/IosMoive/Content/Images/m_ico_support_act.png">
它们分为三类,以link、script、img开头,很容易通过一个正则表达式将它们提取出来。
NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"<(img|link|script|a)[^>]+?(src|href)=[\"']?([^>'\"]+)[\"']?" options:NSRegularExpressionAllowCommentsAndWhitespace error:nil]; NSArray* result = [regex matchesInString:htmlString options:NSMatchingReportCompletion range:NSMakeRange(0, htmlString.length)];result就是包含配到上述链接的列表。找到每个src后,给它们分类,再根据不同的类型将这些文件下载下来,记录在本地的地址。再把 HTML文件网络路径替换成本地路径。
2、再次请求该URL时,UIWebview加载本地路径,响应速度非常快。
[_webView loadHTMLString:loadedString baseURL:[NSURL fileURLWithPath:filePath]];
具体的方法在后面给出的demo中。当然,还有很多细节不能一一道出,但看看源代码会清晰许多。程序也有需要优化地方,欢迎指出。
demo下载