Understanding Cache Access
URL Loading System提供了综合的disk 和 in-memory 策略的请求缓存。使用缓存有利于减少程序对网络的依赖,并且能提高程序的体验。
Using the Cache for a Request
在NSURLResquest实例中使用一个NSURLRequestCachePolicy值,去制定怎么样本地的缓存的策略。
NSURLRequestUseProtocolCachePolicy
, 使用协议默认,自动默认的的会提供比较合适的策略。
NSURLRequestReloadIgnoringCacheData
,使用网络数据,不是使用缓存的数据
NSURLRequestReturnCacheDataElseLoad
,使用缓存数据,不管缓存数据的时间和截止日期,如果实在找不到,再用网络。
orNSURLRequestReturnCacheDataDontLoad
.让网络的请求中,只有本地有数据缓存的才返回数据。如果本地没有缓存的数据,那么即便创建NSURLConnection或者NSURLDownload去请求也是不行的。这个有点离线的意思。
当前只有HTTP和HTTPS request是被缓存的,FTP和file 协议会尝试去获取originating数据在cache policy允许的情况下。定义NSURLProtocol类,可以选择行进行缓存。
Cache Use Senmantics for the HTTP Protocol
日常中比较复杂的的缓存使用情况是,当一个请求是用HTTP协议并且和设置缓存的策略为NSURLReqestUseProtocolCachePolicy。
如果一个request并没有NSCacheURLResponse,那么URL loading系统会从源数据出获取数据。
如果request存在cache response,URL loading系统会检查这个response,然后再去决定这个request的内容是特殊的,需要重新去验证。
如果content必须要重新验证,那么URL loading 系统会创建一个HEAD request去发给服务器,判断现有的资源有没有改变了。如果content没有改变,URL Loading系统会返回 cacheed response。如果变化了,URL Loading系统就重新获取数据。
如果cached response 没有指定说必须需要去验证,那么URL Loading系统检查一下缓存的response存在的最大过期时间。如果缓存的response足够新,那么就直接返回,如果不够新,就发送一个HEAD request给服务器,然后决定需要的resource是否已经改变,如果已经改变就就重新获取,如果没有改变就返回cached的response。
Controlling Cache Programmatically
默认情况下,连接产生的数据会依赖于request的cache policy的策略而缓存下来,就像NSURLProtocol子类控制的那样。
如果你的程序需要精准的去控制你的缓存的数据(在protocol支持cache的情况下),你可以实现一个delegate的方法以允许使用一种pre-request(预请求)的方式决定request是否需要特别去缓存。
- 对于NSURLSession来说,data和upload task,实现
URLSession:dataTask:willCacheResponse:completionHandler:
方法。这个代理方法这会在data and upload task的时候被调用。关于download task的缓存策略是被特殊指定的。 - 对于NSURLConnection,实现
connection:willCacheResponse:
method.
对于你的NSURLSession来说,delagate方法调用completion handler block去告诉session,那些需要去被缓存。对于NSURLConnection,delegate返回那些连接过程中需要被缓存的对象。
这两种例子中,delegate典型的提供下面之一的解决方案:
- 提供provided response对象去允许caching
- A newly created response object to cache a modified response—for example, a response with a storage policy that allows caching to memory but not to disk
NULL
to prevent caching
delagate尅把response对象存入到userinfo的字典中然后于NSCacheURLResponse对象建立联系。这样就是response都存下来了。
注意:如果使用NSURLSession并且实现这个代理方法,你的代理方法必须掉调用completion handler,不然就回内存泄露。
7-1是阻止on-desk caching HTTP response的例子,只把HTTPF response放到内存中去。并且把缓存的response的时间添加到user info字典中去了。
-(NSCachedURLResponse *)connection:(NSURLConnection *)connection
willCacheResponse:(NSCachedURLResponse *)cachedResponse
{
NSCachedURLResponse *newCachedResponse = cachedResponse; NSDictionary *newUserInfo;
newUserInfo = [NSDictionary dictionaryWithObject:[NSDate date]
forKey:@"Cached Date"];
if ([[[[cachedResponse response] URL] scheme] isEqual:@"https"]) {
#if ALLOW_IN_MEMORY_CACHING
newCachedResponse = [[NSCachedURLResponse alloc]
initWithResponse:[cachedResponse response]
data:[cachedResponse data]
userInfo:newUserInfo
storagePolicy:NSURLCacheStorageAllowedInMemoryOnly];
#else // !ALLOW_IN_MEMORY_CACHING
newCachedResponse = nil
#endif // ALLOW_IN_MEMORY_CACHING
} else {
newCachedResponse = [[NSCachedURLResponse alloc]
initWithResponse:[cachedResponse response]
data:[cachedResponse data]
userInfo:newUserInfo
storagePolicy:[cachedResponse storagePolicy]];
}
return newCachedResponse;
}
Understanding Cache Access的更多相关文章
- 2.SDL规范文档
01.安全设计Checklist 输入验证 校验跨信任边界传递的不可信数据(策略检查数据合法性,含白名单机制等)格式化字符串时,依然要检验用户输入的合法性,避免可造成系统信息泄露或者拒绝服务 禁止向J ...
- Parallelized coherent read and writeback transaction processing system for use in a packet switched cache coherent multiprocessor system
A multiprocessor computer system is provided having a multiplicity of sub-systems and a main memory ...
- Cache memory power reduction techniques
Methods and apparatus to provide for power consumption reduction in memories (such as cache memories ...
- 如何使用event 10049分析定位library cache lock and library cache pin
Oracle Library Cache 的 lock 与 pin 说明 一. 相关的基本概念 之前整理了一篇blog,讲了Library Cache 的机制,参考: Oracle Library c ...
- Guava Cache本地缓存
Guava介绍 Guava是一种基于开源的Java库,其中包含谷歌正在由他们很多项目使用的很多核心库. 这个库是为了方便编码,并减少编码错误. 这个库提供用于集合,缓存,支持原语,并发性,常见注解,字 ...
- PSEUDO LEAST RECENTLY USED (PLRU) CACHE REPLACEMENT
A multi-way cache system includes multi-way cache storage circuitry, a pseudo least recently used (P ...
- Partitioned Replacement for Cache Memory
In a particular embodiment, a circuit device includes a translation look-aside buffer (TLB) configur ...
- Virtual address cache memory, processor and multiprocessor
An embodiment provides a virtual address cache memory including: a TLB virtual page memory configure ...
- Oracle-buffer cache、shared pool
http://blog.csdn.net/panfelix/article/details/38347059 buffer pool 和shared pool 详解 http://blog.csd ...
随机推荐
- Caffe提取任意层特征并进行可视化
现在Caffe的Matlab接口 (matcaffe3) 和python接口都非常强大, 可以直接提取任意层的feature map以及parameters, 所以本文仅仅作为参考, 更多最新的信息请 ...
- 使用wifite破解路由器密码
使用wifite破解路由器密码 发表于 2016-02-06 | 分类于 wifite | 暂无评论 | 10次阅读 简介 wifite是一款自动化wep.wpa破解工具,不支持w ...
- 残差网络(Residual Network)
一.背景 1)梯度消失问题 我们发现很深的网络层,由于参数初始化一般更靠近0,这样在训练的过程中更新浅层网络的参数时,很容易随着网络的深入而导致梯度消失,浅层的参数无法更新. 可以看到,假设现在需要更 ...
- 【Eclipse】Elipse自定义library库并导入项目
1.定义像JRE System Library之类的库 (1)点击UserLibrary (2)如果没有就点击new新建一个user library,否则进行4 (3)向user library添加 ...
- 31 - gogs安装-git基础
目录 1 Gogs安装 2 Git介绍 3 使用Github仓库 3.1 Git配置 3.2 远程仓库 4 Git基本使用 4.1 创建版本库 4.2 查看工作区状态 4.3 查看修改内容 4.4 查 ...
- netif_start_queue/netif_wake_queue/netif_stop_queue
在网卡驱动中,内核为发送数据包的流量控制提供了几个主要的函数,用来在驱动程序和内核之间传递流控信息. 主要有4个: 1]netif_start_queue 启动接口传输队列 2]netif_wake ...
- angular项目中使用jquery的问题
1.使用npm命令往项目中添加jQuery. npm install jquery --save 2.在你想要用jQuery的组件中添加. import * as $ from "jquer ...
- Java的Timer定时器
Timer主要用于Java线程里指定时间或周期运行任务,它是线程安全的,但不提供实时性(real-time)保证. 上面提到了守护线程的概念. Java分为两种线程:用户线程和守护线程. 所谓守护线程 ...
- python_xlsxwriter模块
1.workbook类 add_worksheet 用于添加一个新的工作表,sheetname为工作表名称,默认是sheet1,例如: worksheet = workbook.add_workshe ...
- HDU 3001 Travelling(状态压缩DP+三进制)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 题目大意:有n个城市,m条路,每条路都有一定的花费,可以从任意城市出发,每个城市不能经过两次以上 ...