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
NULLto 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 ...
随机推荐
- jq消除网页滚动条
网页有些时候需要能滚动的效果,但是不想要滚动条,我就遇到了这样的需求.自己用jq写了一个垂直滚动条. 纯css也可以实现 .box::-webkit-scrollbar{display:none} 但 ...
- BurpSuite 设置Hostname Resolution
#写在前面 这种情况你可能遇到过: 对方用了CDN, 你查到了对方真实IP, 但还不能100%肯定. 这时候, 最好的测试就是 win/linux修改HOST文件 Win重启电脑 Linux重启网络 ...
- 作为一个新手的Oracle(DBA)学习笔记【转】
一.Oracle的使用 1).启动 *DQL:数据查询语言 *DML:数据操作语言 *DDL:数据定义语言 DCL:数据控制语言 TPL:事务处理语言 CCL:指针控制语言 1.登录 Win+R—cm ...
- 大数据系列之kafka监控kafkaoffsetmonitor安装
1.下载kafkaoffsetmonitor的jar包,可以到github搜索kafkaoffsetmonitor,第一个就是,里面可以下载编译好了的包. KafkaOffsetMonitor-ass ...
- python基础(8)--迭代器、生成器、装饰器
1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大优 ...
- LeetCode818. Race Car
https://leetcode.com/problems/race-car/description/ Your car starts at position 0 and speed +1 on an ...
- 编译报错:LC.exe 已退出
- 快速地从Redhat系转Ubuntu系
ubuntu官网的,https://help.ubuntu.com/community/SwitchingToUbuntu/FromLinux/RedHatEnterpriseLinuxAndFedo ...
- [你必须知道的.NET]第二十三回:品味细节,深入.NET的类型构造器
发布日期:2008.11.2 作者:Anytao © 2008 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. 说在,开篇之前 今天Artech兄在<关于Type Init ...
- NIO-3网络通信
import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import ja ...