NSURLCache实现离线阅读的一点小心得

用来实现网页离线缓存(用于离线阅读)的方式比较多,比如:

1、利用html5的cache机制(但是网页cache有大小限制)
2、利用对html5做自定义解析,对dom树分析后请求并存储相关资源。
3、利用NSURLCache(简单,自己写存储,写一二级缓存效率高,空间无限制)
4、利用NSURLProtocol完成缓存工作(由于NSURLProtocol我还没有在实际项目中使用,了解也不深入,暂不介绍)
今天主要针对NSURLCache,记录一些小心得,关键就是两个方法:

1、- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request;
这个方法主要是用来读取缓存,提供给响应的Request的,因此最好能提供快速的cache数据,否则会引发二次请求(通过网络抓包发现的),这样会给用户带来二倍的流量负担,效率也会明显降低,因此我没有采用网上比较流行的那段代码。
如果是uiwebview的请求,参数request已经不是你最初调用webview load进来的那个request,已经被封装为mutiableRequest。

2、-(void)storeCachedResponse:(NSCachedURLResponse *)cachedResponse forRequest:(NSURLRequest *)request;
这个方法是用来存储缓存的,具体什么时候触发存储,我还没有总结出来,但是有一点是可以肯定的,即,并不是所有文件都会被要求存储下来,因此向html、js、css这些关键数据需要做一些手动工作(因为做皮肤,所以我是通过预先加载来缓存css、js的(发现一个符合命名规则的css会主动下载一系列的皮肤样式)。html我是通过单独请求获取html->存储缓存->load到webview来完成的)

Html的缓存也可以通过js脚本取出html代码来缓存,由于中间我们会对页面做处理,所以没有这样做。
需要针对status code来判断是否缓存(200到300以内的状态码代表资源请求成功,其他的状态码不能缓存下来),通过单独的connection发起请求也需要判断这个。
如果需要与其他模块共享缓存只需要采用同样的目录,及命名规则(我采用的对url做md5),存储nsdata,建议最好mimeType的索引页存储下来,这样网页可以与原生客户端使用同样的缓存数据。
存储成CachedResponse可以保留更多的有效信息,但是这样与其他模块的cache共用就会相对麻烦。
:::注意:
1、前文已经说过:cachedResponseForRequest不能用来发起同步请求请求网络。
2、diskCapacity,memoryCapacity要慎用,因为这两个变量会被webview自动重置为0(我曾经逮了好久才逮到,后边初秋之实也有提到),因此你最好自己生命两个capacity。
3、在缓存文件到目录的同时最好保存文件的mimetype和encoding(运营商网络很多不确定性,比如encoding被网关篡改…)。

 

先简明总结到这里,代码整理好后会分享上来。
(这篇随笔是早起冥想后用1个小时完成的,对比我以往写东西时的速度,可谓是明显提升;)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值