本文主要是对官方文档中URLConnection
类及其代理方法的翻译和总结. 文档连接如下 :
温馨提示 : iOS9以后苹果宣布弃用NSURLConnection. 改用NSURLSession
NSURLConnection
一个NSURLConnection
对象代表加载一个URL request内容. 然而NSURLConnection
的接口很少, 仅仅是start/cancel一个异步请求. 你应该在URLRequest中做好一切设置.
概述
Note :
尽管该类的实例通常被称为 connection, 但是这个connection并不是跟底层的网络连接是1对1的关系.
NSURLConnection
类提供了很多很方便的同步/异步加载URLRequest的方法, 并且使用block回调.
为了更好的对整个加载的流程做控制, 你可以成为NSURLConnection
实例的代理, 实现NSURLConnectionDelegate
和NSURLConnectionDataDelegate
协议. 这样connection在异步加载请求的时候就会告诉你加载的进度和状态等信息. connection也会调用代理的方法让用户重写它的默认行为. (例如指定一个特定的重定位URL等等. ) 这些代理方法将会在发起该异步请求的线程上调用.
Note :
在加载请求期间, connection会强引用他的代理. 当请求完成加载/加载失败/取消的时候就会释放这个强引用
关于NSURLError
的信息在这里
方法
一些过期的方法就不贴出来了
-
发送请求前
-
+canHandleRequest:
: 发送请求之前可以用该方法测试请求是否合法.
-
-
请求URL的信息
-
originalRequest
: 原请求的一份深拷贝 -
currentRequest
: 当前请求
-
-
异步加载
-
-start
: 开始异步加载请求
-
-
停止加载
-
-cancel
: 取消异步加载请求
-
-
代理方法调度
-
-scheduleInRunLoop:forMode
: 设置代理方法调用的RunLoop和模式. -
-setDelegateQueue:
: 设置代理方法调用的队列 -
-unscheduleFromRunLoop:forMode:
: 设置代理方法不要在该RunLoop和模式下调用
-
NSURLConnection Protocols
NSURLConnection
相关的有三个协议 :
- NSURLConnectionDelegate
- NSURLConnectionDataDelegate (继承NSURLConnectionDelegate)
- NSURLConnectionDownloadDelegate (继承NSURLConnectionDelegate)
NSURLConnectionDelegate
主要负责证书的处理和请求完成/错误的处理, 所以几乎所有代理对象都必须遵循这个协议.
特殊情况下需要使用它的子协议 :
- 使用
Newsstand Kit
的downloadWithDelegate:
方法, 代理对象就应该实现downloadDelegate. - 其他情况就实现dataDelegate.
如果代理想要自定义身份验证的处理方法的话就要实现connection:willSendRequestForAuthenticationChallenge:
方法, 如果没有实现则会调用connection:canAuthenticateAgainstProtectionSpace:, connection:didReceiveAuthenticationChallenge:
和connection:didCancelAuthenticationChallenge:
这两个已经弃用了的方法.
当请求发生错误的时候就会调用代理的connection:didFailWithError:
方法. -connectionShouldUseCredentialStorage:
只会在加载之前调用一次.
方法
-
身份验证 :
-
connection:willSendRequestForAuthenticationChallenge:
: 告诉代理准备发送身份验证质询. -
connectionShouldUseCredentialStorage:
: 决定URL加载器是否需要对身份验证做证书存储.
-
-
请求加载完成 :
-
connection:didFailWithError:
: 请求失败
-
NSURLConnectionDataDelegate
提供了上传的进度信息/下载的response data碎片. 并且它还提供了一个新的上传数据流, 如果服务器的响应需要再次请求连接的话(例如使用不同的证书重新发请求).
方法
-
处理接受到的数据 :
-
connection:didReceiveResponse:
: 第一次收到数据 -
connection:didReceiveData:
: 依次收到后来的数据
-
-
加载进度 :
-
connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:
: 发送一个类似HTTP POST请求的字典, 里面包含本次上传的数据长度, 已经上传的数据长度和总数据长度. -
connectionDidFinishLoading:
: 请求成功加载完成.
-
-
重定向处理 :
-
connection:willSendRequest:redirectResponse:
: 做URL重定向处理 -
connection:needNewBodyStream:
: 当connection需要重新重传的时候提供一个原本的数据流.
-
-
缓存策略 :
-
connection:willCacheResponse:
: 当系统准备缓存该响应数据的时候告诉代理.
-
NSURLConnectionDownloadDelegate
提供下载进度信息, 下载完成时提供下载好的可访问的文件的URL. 可以实现断点续传.
代理类除了实现该协议的方法之外还需要实现其父类协议NSURLConnectionDelegate
的方法.
方法
- 管理下载 :
-
connection:didWriteData:totalBytesWritten:expectedTotalBytes:
: 下载的时候会一直调用这个方法, 利用这几个参数刷新UI的进度条 -
connectionDidResumeDownloading:totalBytesWritten:expectedTotalBytes:
: 当恢复下载的时候告诉代理. -
connectionDidFinishDownloading:destinationURL:
: 下载完成的时候告诉代理目标文件的URL.
-
由于iOS9之后, NSURLConnection已经被弃用了, 接下来会带来NSURLSession的文档翻译
网友评论