在通过http下载数据的时候,我们经常会用到NSURLConnection这个类。下面来简单介绍一下这个类。
简介:
NSURLConnection的对象提供支持执行加载一个URL请求。NSURLConnection的接口是稀疏的,只提供控制开始和取消一个URL请求的异步下载方法。
NSURLConnection的代理方法定义在NSURLConnectionDelegate协议里面。NSURLConnectionDelegate协议允许对象接收关于这个异步URL下载的回调信息。其他的代理方法提供了很多方法支持下载过程中的反馈和控制。这些委托方法将会在NSURLConnection的相关对象的线程开始异步下载操作以后被调用(也就是 start以后)。
NSURLConnection的有一个方便的类方法,同步加载URL请求。
- sendSynchronousRequest:returningResponse:error:
注意:在下载过程中,这个连接为delegate保持一个强引用(strong reference),当它加载成功,失败或者被取消的时候,这个引用将会被释放。
(官方文档原句:During a download the connection maintains a strong reference to the delegate. It releases that strong reference when the connection finishes loading, fails, or is canceled.)
NSURLConnection 协议:
NSURLConnection类与两个官方的协议协同工作:NSURLConnectionDelegate Protocolc和NSURLConnectionDownloadDelegate协议。
这两个协议有不同的作用:
使用NSURLConnectionDelegate协议,你需要写一个符合该协议的类。NSURLConnectionDelegate协议主要被用于凭据处理(credential handling),但它也处理的连接完成。在下载过程中,因为它处理下载过程中的连接失败,该协议通常必须执行。
NSURLConnectionDownloadDelegate协议提供的数据比如已经被下载,支持断点续传,并提供了下载完成通知。
在使用NSURLConnection的时候,必须实现一下几个代理方法(定义在NSURLConnectionDelegate中)
- - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
//当服务器提供了足够客户程序创建NSURLResponse对象的信息时,代理对象会收到一个connection:didReceiveResponse:消息,在消息内可以检查NSURLResponse对象和确定数据的预期长度,mime类型,文件名以及其他服务器提供的元信息.要注意,一个简单的连接也可能会收到多个connection:didReceiveResponse:消息当服务器连接重置或者一些罕见的原因(比如多组mime文档),代理都会收到该消息这时候应该重置进度指示,丢弃之前接收的数据(来自官方文档,下同)
- - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
//当下载开始的时候,每当有数据接收,代理会定期收到connection:didReceiveData:消息代理应当在实现中储存新接收的数据
- - (void)connectionDidFinishLoading:(NSURLConnection *)connection;
//如果连接请求成功的下载,代理会接收connectionDidFinishLoading:消息代理不会收到其他的消息了,在消息的实现中,应该释放掉连接
- - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
//当下载的过程中有错误发生的时候,代理会收到一个connection:didFailWithError消息,消息参数里面的NSError对象提供了具体的错误细节,它也能提供在用户信息字典里面失败的url请求(使用NSErrorFailingURLStringKey).当代理接收到连接的connection:didFailWithError消息后,对于该连接不会在收到任何消息
还有一些其他有用的方法:
方法(Tasks):
预检连接请求(Preflighting a Connection Request)
- + canHandleRequest://
- – originalRequest
- – currentRequest
同步加载数据(Loading Data Synchronously)
- + sendSynchronousRequest:returningResponse:error:
异步加载数据(Loading Data Asynchronously)
- + connectionWithRequest:delegate:
- – initWithRequest:delegate:
- – initWithRequest:delegate:startImmediately:
- + sendAsynchronousRequest:queue:completionHandler:
- – start
停止连接(Stopping a Connection)
- – cancel
调度代理消息(Scheduling Delegate Messages)
- – scheduleInRunLoop:forMode:
- – setDelegateQueue:
- – unscheduleFromRunLoop:forMode:
以上是类的介绍,还有以下几点需要注意:
在请求的过程中,connectionDidFinishLoading:没有被调用之前,可以随时调用来[primaryConnection cancel];终止这个http请求。当然,cancel之后一定要release。
connectionDidFinishLoading:下载结束,别忘了释放~
在调试过程中,还发现NSURLConnection有一个小小的问题。
初始化了NSURLConnection之后,如果并不start,直接调用cancel,release,可能会导致内存泄漏~