NSURLConnection基本用法(苹果原生)

一、NSURLConnection的常用类

(1)NSURL:请求地址

(2)NSURLRequest/NSMutableURLRequest:封装一个请求,保存发给服务器的全部数据,包括一个NSURL对象,请求方法、请求头、请求体....

(3)NSURLConnection:负责发送请求,建立客户端和服务器的连接。发送NSURLRequest的数据给服务器,并收集来自服务器的响应数据

 

二、NSURLConnection的使用

1、使用NSURLConnection发送请求的步骤

(1)创建一个NSURL对象,设置请求路径(设置请求路径)

(2)传入NSURL创建一个NSURLRequest对象,设置请求头和请求体(创建请求对象)

(3)使用NSURLConnection发送NSURLRequest(发送请求)

 

 

 

 

 

设置URL       NSString *urlStr = [NSString stringWithFormat:@"http://192.168.1.200:8080/MJServer/login?username=%@&pwd=%@", username, pwd];   
                     urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];      URL里有中文,需要转码 
                    NSURL *url = [NSURL URLWithString:urlStr];  //创建URL路径
设置请求      NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];    创建请求,默认是get请求
 
设置请求超时等待时间(超过这个时间就算超时,请求失败)  - (void)setTimeoutInterval:(NSTimeInterval)seconds;
 
设置请求方法(比如GET和POST)  - (void)setHTTPMethod:(NSString *)method;
 
设置请求体  - (void)setHTTPBody:(NSData *)data;
 
设置请求头  - (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;

 

 


 

 

 

 

2、发送请求方式

 

 

(1)同步请求(会一直等待服务器返回数据,这行代码会卡住,如果服务器没有返回数据,那么在主线程UI会卡住不能继续执行操作)

             NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]

 

(2)异步请求(block回掉方式)

             NSOperationQueue *queue = [NSOperationQueue mainQueue];

             [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 

                      if (data) {     必须价格判断,如果data为空,那么程序会崩溃(data不能为空)

                           // 当请求结束的时候调用 block(拿到了服务器的数据, 请求失败)

                      } }];

(3)异步请求(NSURLConnectionDataDelegate方式)

         NSURLConnection *conn=[NSURLConnection connectionWithRequest:request delegate:self];

         [conn start]

代理方法:

请求失败:- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

请求服务器响应:- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

请求接收数据(调用多次):- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

请求数据接收完毕:- (void)connectionDidFinishLoading:(NSURLConnection *)connection

 

 

block代码段:当服务器有返回数据的时候调用会开一条新的线程去发送请求,主线程继续往下走,当拿到服务器的返回数据的数据的时候再回调 block,执行block代码段。这种情况不会卡住主线程。
队列的作用:决定这个block操作放在哪个线程执行?
刷新UI界面的操作应该放在主线程执行,不能放在子线程,在子线程处理UI相关操作会出现一些莫名的问题。
提示:
(1)创建一个操作,放在NSOperation队列中执行,默认是异步执行的。
(2)mainqueue   返回一个和主线程相关的队列,即主队列。
 

 

 

 

 

 

 

 

 

posted on 2016-05-04 11:14  RobotZhu  阅读(298)  评论(0编辑  收藏  举报

导航