NSURLConnection类简介

21 篇文章 0 订阅
12 篇文章 0 订阅

在通过http下载数据的时候,我们经常会用到NSURLConnection这个类。下面来简单介绍一下这个类。

简介:

NSURLConnection的对象提供支持执行加载一个URL请求。NSURLConnection的接口是稀疏的,只提供控制开始和取消一个URL请求的异步下载方法。

NSURLConnection的代理方法定义在NSURLConnectionDelegate协议里面。NSURLConnectionDelegate协议允许对象接收关于这个异步URL下载的回调信息。其他的代理方法提供了很多方法支持下载过程中的反馈和控制。这些委托方法将会在NSURLConnection的相关对象的线程开始异步下载操作以后被调用(也就是 start以后)。

NSURLConnection的有一个方便的类方法,同步加载URL请求。

[cpp]  view plain copy
  1. 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中)

[cpp]  view plain copy
  1. - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;  

//当服务器提供了足够客户程序创建NSURLResponse对象的信息时,代理对象会收到一个connection:didReceiveResponse:消息,在消息内可以检查NSURLResponse对象和确定数据的预期长度,mime类型,文件名以及其他服务器提供的元信息.要注意,一个简单的连接也可能会收到多个connection:didReceiveResponse:消息当服务器连接重置或者一些罕见的原因(比如多组mime文档),代理都会收到该消息这时候应该重置进度指示,丢弃之前接收的数据(来自官方文档,下同)

[cpp]  view plain copy
  1. - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;  

//当下载开始的时候,每当有数据接收,代理会定期收到connection:didReceiveData:消息代理应当在实现中储存新接收的数据

[cpp]  view plain copy
  1. - (void)connectionDidFinishLoading:(NSURLConnection *)connection;  

//如果连接请求成功的下载,代理会接收connectionDidFinishLoading:消息代理不会收到其他的消息了,在消息的实现中,应该释放掉连接 


[plain]  view plain copy
  1. - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;  

//当下载的过程中有错误发生的时候,代理会收到一个connection:didFailWithError消息,消息参数里面的NSError对象提供了具体的错误细节,它也能提供在用户信息字典里面失败的url请求(使用NSErrorFailingURLStringKey).当代理接收到连接的connection:didFailWithError消息后,对于该连接不会在收到任何消息

还有一些其他有用的方法:

方法(Tasks):

预检连接请求(Preflighting a Connection Request)

[cpp]  view plain copy
  1. + canHandleRequest://  


连接的URL信息(Connection URL Information)
[cpp]  view plain copy
  1. – originalRequest  
  2. – currentRequest  

同步加载数据(Loading Data Synchronously)

[cpp]  view plain copy
  1. + sendSynchronousRequest:returningResponse:error:  

异步加载数据(Loading Data Asynchronously)

[cpp]  view plain copy
  1. + connectionWithRequest:delegate:  
  2. – initWithRequest:delegate:  
  3. – initWithRequest:delegate:startImmediately:  
  4. + sendAsynchronousRequest:queue:completionHandler:  
  5. – start  

停止连接(Stopping a Connection)

[cpp]  view plain copy
  1. – cancel  

调度代理消息(Scheduling Delegate Messages)

[cpp]  view plain copy
  1. – scheduleInRunLoop:forMode:  
  2. – setDelegateQueue:  
  3. – unscheduleFromRunLoop:forMode:  


以上是类的介绍,还有以下几点需要注意:

在请求的过程中,connectionDidFinishLoading:没有被调用之前,可以随时调用来[primaryConnection cancel];终止这个http请求。当然,cancel之后一定要release。

connectionDidFinishLoading:下载结束,别忘了释放~

在调试过程中,还发现NSURLConnection有一个小小的问题。

初始化了NSURLConnection之后,如果并不start,直接调用cancel,release,可能会导致内存泄漏~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值