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来说,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的更多相关文章

  1. 2.SDL规范文档

    01.安全设计Checklist 输入验证 校验跨信任边界传递的不可信数据(策略检查数据合法性,含白名单机制等)格式化字符串时,依然要检验用户输入的合法性,避免可造成系统信息泄露或者拒绝服务 禁止向J ...

  2. 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 ...

  3. Cache memory power reduction techniques

    Methods and apparatus to provide for power consumption reduction in memories (such as cache memories ...

  4. 如何使用event 10049分析定位library cache lock and library cache pin

    Oracle Library Cache 的 lock 与 pin 说明 一. 相关的基本概念 之前整理了一篇blog,讲了Library Cache 的机制,参考: Oracle Library c ...

  5. Guava Cache本地缓存

    Guava介绍 Guava是一种基于开源的Java库,其中包含谷歌正在由他们很多项目使用的很多核心库. 这个库是为了方便编码,并减少编码错误. 这个库提供用于集合,缓存,支持原语,并发性,常见注解,字 ...

  6. PSEUDO LEAST RECENTLY USED (PLRU) CACHE REPLACEMENT

    A multi-way cache system includes multi-way cache storage circuitry, a pseudo least recently used (P ...

  7. Partitioned Replacement for Cache Memory

    In a particular embodiment, a circuit device includes a translation look-aside buffer (TLB) configur ...

  8. Virtual address cache memory, processor and multiprocessor

    An embodiment provides a virtual address cache memory including: a TLB virtual page memory configure ...

  9. Oracle-buffer cache、shared pool

    http://blog.csdn.net/panfelix/article/details/38347059   buffer pool 和shared pool 详解 http://blog.csd ...

随机推荐

  1. WAMP允许外部访问的修改方法

    apache配置文件httpd.conf里的 "Require local"改" Require all granted"

  2. webgote的例子(6)SQL注入(盲注)

    SQL Injection - Blind (WS/SOAP) 本期演示的是盲注的手法.有些网站在与数据库交互的地方进行了很好的修饰,将报错的语句进行修改,即使你找到了注入点也无法下手拿数据,这个时候 ...

  3. Linux内核同步原语之原子操作【转】

    转自:http://blog.csdn.net/npy_lp/article/details/7262388 避免对同一数据的并发访问(通常由中断.对称多处理器.内核抢占等引起)称为同步. ——题记 ...

  4. linux常用命令一些解释

    ls 命令是linux下最常用的命令.ls命令就是list的缩写缺省下ls用来打印出当前目录的清单如果ls指定其他目录那么就会显示指定目录里的文 件及文件夹清单. 通过ls 命令不仅可以查看li ...

  5. sea.js中的checkbox批量操作

    <table width="100%" border="0" cellspacing="0" cellpadding="0& ...

  6. Oracle安装出现报错

    报错信息如下: >>> Couldnot execute auto check for display colors using command /usr/bin/xdpyinfo. ...

  7. FAQ1: 列表索引和切片问题

    问题1. 超过列表成员个数的索引访问列表会出现IndexError错误,但是如果用切片去访问就不会报错,而是返回一个空列表.同样元组也是. >>> a=[1,2,3,4] >& ...

  8. lumen 框架的特殊使用

    1. 配置代码格式管理工具: composer require squizlabs/php_codesniffer, 使用 php artisan cs 检查代码格式: 2.单元测试用例编写 1./d ...

  9. mysql 操作时间戳

    1.将long显示成时间 SELECT FROM_UNIXTIME(1249488000, '%Y%m%d' ) 2.日期格式化成时间戳 SELECT UNIX_TIMESTAMP('2016-05- ...

  10. 控制终端tcgetattr函数与tcsetattr函数

    tcgetattr(fd,&oldios); //获得与终端相关的参数,参数保存在oldios中 newios.c_cflag = nSpeed | CS8 | CLOCAL | CREAD; ...