NSURLConnection介绍

NSURLConnection可以非常便捷的发送同步或异步网络请求

+(NSData*)sendSynchronousRequest:(NSURLRequest*)requestreturningResponse:(NSURLResponse**)responseerror:(NSError**)error+(void)sendAsynchronousRequest:(NSURLRequest*)requestqueue:(NSOperationQueue*)queuecompletionHandler:(void(^)(NSURLResponse*response,NSData*data,NSError*connectionError))handler

出于各方面的考虑,苹果在iOS9.0开始弃用NSURLConnection,而是用NSURLSession代替。



同步的网络请求

NSData数据类,从URL中获取数据创建对象的方法,就属于同步请求,其弊端是无法获得应答对象。

NSURLConnection提供类方法,快速发送一个异步请求

+(NSData*)sendSynchronousRequest:(NSURLRequest*)requestreturningResponse:(NSURLResponse**)responseerror:(NSError**)error

入参request:请求对象(url、请求类型、请求参数)

出参response:响应对象

出参error:错误对象(如果出错的话)

返回值:响应数据


如:请求获取一个图片资源


同步请求的弊端:

请求过程耗时,会使当前线程阻塞,无法进行其他操作

特别是在主线程中调用时,此过程中App将无法进行任何UI操作。



异步的网络请求—与多线程配合

即,将同步请求的操作放在子线程中执行

需要注意的是:子线程不能更新UI,更新UI操作需要回到主线程中完成

如:使用GCD


异步的网络请求— 发送异步请求方法

NSURLConnection提供了一个发送异步请求的方法

+(void)sendAsynchronousRequest:(NSURLRequest*)requestqueue:(NSOperationQueue*)queuecompletionHandler:(void(^)(NSURLResponse*response,NSData*data,NSError*connectionError))handler

异步操作,当前线程并不等待请求过程的完成,故不能通过参数或返回值获得结果

异步操作获得结果的操作通常有几种做法:代理、通知、block


该操作使用的是block方式,block中的参数通常是获得结果(响应对象、响应数据、错误对象)


异步的网络请求 — 使用代理监听请求过程

NSURLConnection对象包含一个代理属性

提供代理协议<NSURLConnectionDelegate><NSURLConnectionDataDelegate>

常用的代理方法:

//接收到响应对象-(void)connection:(NSURLConnection*)connectiondidReceiveResponse:(NSURLResponse*)response//收到部分或全部数据-(void)connection:(NSURLConnection*)connectiondidReceiveData:(NSData*)data//完成响应数据的接收-(void)connectionDidFinishLoading:(NSURLConnection*)connection//请求失败-(void)connection:(NSURLConnection*)connectiondidFailWithError:(NSError*)error

如: