ios 怎么取到uiwebview里自动缓存的数据

 我来答
huanglenzhi
2015-01-27 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517194
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部
  顺便说下NSURLRequest对象,它有个cachePolicy属性,只要其值为NSURLRequestReloadIgnoringLocalCacheData的话,就不会访问缓存。可喜的是这种情况貌似只有在缓存里没取到,或是强制刷新时才可能出现。
  实际上NSURLCache本身就有磁盘缓存功能,然而在iOS上,NSCachedURLResponse却被限制为不能缓存到磁盘(NSURLCacheStorageAllowed被视为NSURLCacheStorageAllowedInMemoryOnly)。
  不过既然知道了原理,那么只要自己实现一个NSURLCache的子类,然后改写cachedResponseForRequest:方法,让它从硬盘读取缓存即可。

  于是就开工吧。这次的demo逻辑比较复杂,因此我就按步骤来说明了。

  先定义视图和控制器。
  它的逻辑是打开应用时就尝试访问缓存文件,如果发现存在,则显示缓存完毕;否则就尝试下载整个网页的资源;在下载完成后,也显示缓存完毕。
  不过下载所有资源需要解析HTML,甚至是JavaScript和CSS。为了简化我就直接用一个不显示的UIWebView载入这个页面,让它自动去发起所有请求。
  当然,缓存完了还需要触发事件来显示网页。于是再提供一个按钮,点击时显示缓存的网页,再次点击就关闭。
  顺带一提,我本来想用Google为例的,可惜它自己实现了HTML 5离线浏览,也就体现不出这种方法的意义了,于是只好拿百度来垫背。
  Objective-c代码 收藏代码
  #import <UIKit/UIKit.h>

  @interface WebViewController : UIViewController <UIWebViewDelegate> {
  UIWebView *web;
  UILabel *label;
  }

  @property (nonatomic, retain) UIWebView *web;
  @property (nonatomic, retain) UILabel *label;

  - (IBAction)click;

  @end

  #import "WebViewController.h"
  #import "URLCache.h"

  @implementation WebViewController

  @synthesize web, label;

  - (IBAction)click {
  if (web) {
  [web removeFromSuperview];
  self.web = nil;
  } else {
  CGRect frame = {{0, 0}, {320, 380}};
  UIWebView *webview = [[UIWebView alloc] initWithFrame:frame];
  webview.scalesPageToFit = YES;
  self.web = webview;

  NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com/"]];
  [webview loadRequest:request];
  [self.view addSubview:webview];
  [webview release];
  }
  }

  - (void)addButton {
  CGRect frame = {{130, 400}, {60, 30}};
  UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
  button.frame = frame;
  [button addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];
  [button setTitle:@"我点" forState:UIControlStateNormal];
  [self.view addSubview:button];
  }

  - (void)viewDidLoad {
  [super viewDidLoad];

  URLCache *sharedCache = [[URLCache alloc] initWithMemoryCapacity:1024 * 1024 diskCapacity:0 diskPath:nil];
  [NSURLCache setSharedURLCache:sharedCache];

  CGRect frame = {{60, 200}, {200, 30}};
  UILabel *textLabel = [[UILabel alloc] initWithFrame:frame];
  textLabel.textAlignment = UITextAlignmentCenter;
  [self.view addSubview:textLabel];
  self.label = textLabel;

  if (![sharedCache.responsesInfo count]) { // not cached
  textLabel.text = @"缓存中…";

  CGRect frame = {{0, 0}, {320, 380}};
  UIWebView *webview = [[UIWebView alloc] initWithFrame:frame];
  webview.delegate = self;
  self.web = webview;

  NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com/"]];
  [webview loadRequest:request];
  [webview release];
  } else {
  textLabel.text = @"已从硬盘读取缓存";
  [self addButton];
  }

  [sharedCache release];
  }

  - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
  self.web = nil;
  label.text = @"请接通网络再运行本应用";
  }

  - (void)webViewDidFinishLoad:(UIWebView *)webView {
  self.web = nil;
  label.text = @"缓存完毕";
  [self addButton];

  URLCache *sharedCache = (URLCache *)[NSURLCache sharedURLCache];
  [sharedCache saveInfo];
  }

  - (void)didReceiveMemoryWarning {
  [super didReceiveMemoryWarning];

  if (!web) {
  URLCache *sharedCache = (URLCache *)[NSURLCache sharedURLCache];
  [sharedCache removeAllCachedResponses];
  }
  }

  - (void)viewDidUnload {
  self.web = nil;
  self.label = nil;
  }

  - (void)dealloc {
  [super dealloc];
  [web release];
  [label release];
  }

  @end
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式