Chinaunix首页 | 论坛 | 博客
  • 博客访问: 431281
  • 博文数量: 83
  • 博客积分: 2622
  • 博客等级: 少校
  • 技术积分: 1345
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-17 08:59
个人简介

一直在努力

文章分类

全部博文(83)

文章存档

2014年(3)

2013年(9)

2012年(46)

2010年(25)

分类:

2010-09-10 15:16:36

URL loading system是一系列类和协议,为应用程序提供了一个URL来访问指定的数据集的基本能力。这些类可分为五类:URL loading, cache management, authentication and credentials, cookie storage, and protocol support.
Figure 1  The URL loading system class hierarchy
URL LODAING
在URL loading system中最常用的允许应用程序创建一个URL包含URL请求并且从资源处下载。一种新的网址的内容要求是代表一个NSURLRequest对象。该NSURLRequest类封装在一个协议无关的方式和任何一个URL协议的具体性质。它还提供了一个接口来设置连接超时和有关协议,任何在本地缓存数据。该NSMutableURLRequest类是可变的NSURLRequest子类,允许客户端应用程序来改变现有的请求。
注意:当app使用NSMutableRequest初始化一个connection或download之后,使用request做的deep copy,那么在download已经被初始化之后改变就不会影响到之前的download。(PS:个人理解可能是connection或download中使用的request是一个request的深拷贝,因此对request的更改不会影响到已经被初始化的connection或download上);
 Protocols, such as HTTP, that support protocol-specific properties must create categories on the NSURLRequest andNSMutableURLRequest classes to provide accessors for those properties. As an example, the HTTP protocol adds methods to NSURLRequest to return the HTTP request body, headers, and transfer method. It also adds methods toNSMutableURLRequest to set the corresponding values. Methods for setting and getting property values in those accessors are exposed in the NSURLProtocol class.
从sever端来得response包含两个部分:metadata(包含内容)和URL的内容数据。metadata数据被封装在NULResponse中,并且以MIME的形式组织,除了内容长度,还有文本编码格式,response来源的URL,Protocols能够创建NSURLResponse的子类存储 protocol-specific metadata.例如,NSHTTPURLResponse stores the headers and the status code returned by the web server.
注意:NSURLResponse仅存储metadata,NSCachedURLResponse实例用于封装NSURLResponse,URL content data,以及application-provided information。

The NSURLConnection and NSURLDownload classes provide the interface to make a connection specified by anNSURLRequest object and download the contents. An NSURLConnection object provides data to the delegate as it is received from the originating source, whereas an NSURLDownload object writes the request data directly to disk. Both classes provide extensive delegate support for responding to redirects, authentication challenges, and error conditions.

the NSURLConnection class provides a delegate method that allows an application to control the caching of a response on a per-request basis. Downloads initiated by an NSURLDownload instance are not cached

Cache Management

NSURLConnection根据NSURLRequest初始化是的具体cache policy去请求CAche。
NSURLCache用于提供配置cache size 和在磁盘存储的位置,用于提供方法管理包含cached responses的NSCachedURLResponse对象的集合。
NSCachedURLResponse封装了NSURLResponse和URL connect data。同时也提供有 a user info dictionary that can be used by an application to cache any custom data.
Not all protocol implementations support response caching. Currently only http and https requests are cached, and https requests are never cached to disk.

An NSURLConnection can control whether a response is cached and whether the response should be cached only in memory by implementing the connection:willCacheResponse: delegate method.

Protocol Support

The URL loading system design allows a client application to extend the protocols that are supported for transferring data. The URL loading system natively supports httphttpsfile, and ftp protocols.

Custom protocols are implemented by subclassing NSURLProtocol and then registering the new class with the URL loading system using the NSURLProtocol class method registerClass:. When an NSURLConnection or NSURLDownload object initiates a connection for an NSURLRequest, the URL loading system consults each of the registered classes in the reverse order of their registration. The first class that returns YES for a canInitWithRequest: message is used to handle the request.

The URL loading system is responsible for creating and releasing NSURLProtocol instances when connections start and complete. An application should never create an instance of NSURLProtocol directly.

When an NSURLProtocol subclass is initialized by the URL loading system, it is provided a client object that conforms to the NSURLProtocolClient protocol. The NSURLProtocol subclass sends messages from the NSURLProtocolClient protocol to the client object to inform the URL loading system of its actions as it creates a response, receives data, redirects to a new URL, requires authentication, and completes the load. If the custom protocol supports authentication, then it must conform to the NSURLAuthenticationChallengeSender protocol.

创建Connection
1。至少要实现以delegate方法:
 connection:didReceiveResponse:,connection:didReceiveData:connection:didFailWithError: and connectionDidFinishLoading:.
2。 NSU
3.预估计更新进度
你可以估计http post使用下述方法:
但是这不是精确的统计进度,因为连接有可能失败也有可能遇到需要验证检验。
4。同步下载数据
NSURLConnection支持下载一个NSURLRequest以同步的方式,这需要是
sendSynchronousRequest:returningResponse:error:
下载成功后将会返回一个NSData对象和一个NSURLResponse的引用。否则返回nil和NSError引用
使用NSURLDownload
NSURLDownload提供一种直接将URL的内容下载disk上。提供的接口类似于NSURLConnection,能够对MacBinary, BinHex and gzip编码之后的文件解码。不像NSURLConection,它的数据不用缓存数据缓存。但是不能用于IOS,因为下载直接定位到文件系统在ios中位置不明确。
处理重定向和其他的请求改变的情况
对于NSURLConnection处理重定向要实现方法
四种处理方法:
  • The delegate can allow the redirect by simply returning the provided request.

  • The delegate can create a new request, pointing to a different URL, and return that request.

  • The delegate can reject the redirect and receive any existing data from the connection by returning nil.

  • The delegate can cancel both the redirect and the connection by sending the cancelmessage

Understanding Cache Access
NSURLRequest实体说明如何使用local cache通过设置cache policy NSURLRequestCachePolicy的值:
NSURLRequest默认的cache policy是NSURLRequestUseProtocolCachePolicy, 是最能保持一致性的协议。
NSURLRequestReloadIgnoringCacheData 忽略缓存直接从原始地址下载
NSURLRequestReturnCacheDataElseLoad 只有在cache中不存在data时才从原始地址下载
NSURLRequestReturnCacheDataDontLoad 允许app确定是否要返回cache数据,如果使用这种协议当本地不存在response的时候创建NSURLConnection or NSURLDownload实例时将会马上返回nil;这类似于离线模式,没有建立网络连接;
注:目前,只有响应HTTP和HTTPS请求被缓存起来。 FTP和FILE协议尝试访问原始地址是被允许的在cache 协议中。自定义NSURLProtocol类可以提供缓存,如果他们选择。

Cache Use Semantics for the http Protocol

使用缓存协议为HTTP语义
最复杂的高速缓存的使用情况是,当一个请求使用HTTP协议,并已设置缓存协议为NSURLRequestUseProtocolCachePolicy。
如果当前请求的NSCachedURLResponse不存在,那么就从原始地址重新获取。如果有一个缓存的响应该请求时,URL加载系统检查该response,以确定它是否表明应对其包含的内容必须重新生效。如果内容必须重新验证建立连接到源代码,看看原始资源是否已经改变。如果没有改变,然后返回响应从本地缓存。如果有改变,提取数据从原始资源处。
如果response没有表明内容必须重新验证那么response的最大保留时间和期限就会被检查,如果是最近的,那么response就会从本地的cache中返回,如果response已经是陈旧的,那么就会从原始资源处获得新的数据。如果新数据可获得则返回新数据否则返回cache的内容;
阅读(2125) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~