NSURLConnection从入门到放弃

尽管NSURLConnection已经不建议使用了,iOS 7取而代之的是NSURLSession,但是本文依然打算剖析一下,其中一些思想还是值得学习一下,如果您不用NSURLConnection,并且也不打算尝试使用,可以跳过本文。

一、概念介绍

NSURLConnection是2003年随着第一版Safari的发布而发布的,它不单单是一个网络请求类,而是指代Foundation框架的URL系统中的一系列关联的组件:NSURLRequestNSURLResponseNSURLProtocolNSHTTPCookieStorageNSURLCredentialStorage以及同名类NSURLConnection

1. 异步处理代理

其中,NSURLRequest被传递给NSURLConnection。被委托对象(遵守以前的非正式协议<NSURLConnectionDelegate><NSURLConnectionDataDelegate>)异步返回一个NSURLResponse以及包含服务器返回信息的NSData

2. 请求策略

在一个请求被发送到服务器之前,系统会先查询共享的缓存信息,然后根据策略(policy)以及可用性(availability)的不同,一个已经被缓存的响应可能会被立即返回。如果没有缓存的响应可用,则这个请求将根据我们指定的策略来缓存它的响应以便将来的请求可以使用。

3. 认证策略

在把请求发送给服务器的过程中,服务器可能会发出鉴权查询(authentication challenge),这可以由共享的 cookie 或机密存储(credential storage)来自动响应,或者由被委托对象来响应。发送中的请求也可以被注册的NSURLProtocol对象所拦截,以便在必要的时候无缝地改变其加载行为。

4. 下载过程

NSURLConnection下载文件时,先是将整个文件下载到内存,然后再写入到沙盒,如果文件比较大,就会出现内存暴涨的情况。

二、使用步骤

请求步骤:

  • 设置请求路径
  • 创建请求对象(默认是GET请求,且已经默认包含了请求头)
  • 发送网络请求
  • 接收到服务器的响应后,解析响应体

0.常用代理介绍

1. 各种方法请求

  • 方法一:利用sendSynchronousRequest发送GET请求,该请求是同步的

  • 方法二:利用sendAsynchronousRequest发送POST请求,该请求是异步的

  • 方法三:通过设置代理,来处理请求响应或数据

2. NSURLConnection 与 NSRunLoop 的关联使用

主要是区分 NSURLConnection 在主线程和子线程发送网络请求的区别

  • 主线程

  • 子线程

因为 NSURLConnection 是局部变量,当我们创建的时候其实是会默认添加到当前的 RunLoop 中,如果是在主线程添加,主线程的 RunLoop 是默认有的,无须我们创建;然而如果在子线程中,是默认没有 RunLoop 和输入源的,所以需要给子线程手动添加 RunLoop

调用start 方法时,如果没有 RunLoop ,会默认添加一个 RunLoop 到当前的线程中来,然后将connection加到runLoop中。


至此,NSURLConnection的简介结束,只是提供了最简单应用的参考,如有不足之处,请不吝指教。下一篇简介目前推荐应用的NSURLSession,敬请期待……

参考文档

http://www.jianshu.com/p/056b1817d25a

http://www.jianshu.com/p/982a3035c93a

http://www.jianshu.com/p/63e2ad28459f

http://www.jianshu.com/p/f291ee58c012

感觉不错,打个赏?
微信                                 支付宝
pay_weixin            pay_zhifubao
金额随意 快来“”我呀~
联系方式:kelvin@fishbay.cn

发表评论

电子邮件地址不会被公开。 必填项已用*标注