🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
 移动互联网时代,网络通信已是手机终端必不可少的功能。我们的应用中也必不可少的使用了网络通信,增强客户端与服务器交互。这一篇提供了使用NSURLConnection实现http通信的方式。 NSURLConnection提供了异步请求、同步请求两种通信方式。 **1、异步请求** iOS5.0 SDK NSURLConnection类新增的sendAsynchronousRequest:queue:completionHandler:方法,从而使iOS5支持两种异步请求方式。我们先从新增类开始。 1)sendAsynchronousRequest iOS5.0开始支持sendAsynchronousReques方法,方法使用如下: ~~~ - (void)httpAsynchronousRequest{ NSURL *url = [NSURL URLWithString:@"http://url"]; NSString *post=@"postData"; NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"POST"]; [request setHTTPBody:postData]; [request setTimeoutInterval:10.0]; NSOperationQueue *queue = [[NSOperationQueue alloc]init]; [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){ if (error) { NSLog(@"Httperror:%@%d", error.localizedDescription,error.code); }else{ NSInteger responseCode = [(NSHTTPURLResponse *)response statusCode]; NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"HttpResponseCode:%d", responseCode); NSLog(@"HttpResponseBody %@",responseString); } }]; } ~~~       sendAsynchronousReques可以很容易地使用NSURLRequest接收回调,完成http通信。 2)connectionWithRequest iOS2.0就开始支持connectionWithRequest方法,使用如下: ~~~ - (void)httpConnectionWithRequest{ NSString *URLPath = [NSString stringWithFormat:@"http://url"]; NSURL *URL = [NSURL URLWithString:URLPath]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL]; [NSURLConnection connectionWithRequest:request delegate:self]; } - (void)connection:(NSURLConnection *)theConnection didReceiveResponse:(NSURLResponse *)response { NSInteger responseCode = [(NSHTTPURLResponse *)response statusCode]; NSLog(@"response length=%lld statecode%d", [response expectedContentLength],responseCode); } // A delegate method called by the NSURLConnection as data arrives. The // response data for a POST is only for useful for debugging purposes, // so we just drop it on the floor. - (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)data { if (mData == nil) { mData = [[NSMutableData alloc] initWithData:data]; } else { [mData appendData:data]; } NSLog(@"response connection"); } // A delegate method called by the NSURLConnection if the connection fails. // We shut down the connection and display the failure. Production quality code // would either display or log the actual error. - (void)connection:(NSURLConnection *)theConnection didFailWithError:(NSError *)error { NSLog(@"response error%@", [error localizedFailureReason]); } // A delegate method called by the NSURLConnection when the connection has been // done successfully. We shut down the connection with a nil status, which // causes the image to be displayed. - (void)connectionDidFinishLoading:(NSURLConnection *)theConnection { NSString *responseString = [[NSString alloc] initWithData:mData encoding:NSUTF8StringEncoding]; NSLog(@"response body%@", responseString); } ~~~    connectionWithRequest需要delegate参数,通过一个delegate来做数据的下载以及Request的接受以及连接状态,此处delegate:self,所以需要本类实现一些方法,并且定义mData做数据的接受。 需要实现的方法: 1、获取返回状态、包头信息。 ~~~ - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; ~~~ 2、连接失败,包含失败。 ~~~ - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error; ~~~ 3、接收数据 ~~~ - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; ~~~ 4、数据接收完毕 -(void)connectionDidFinishLoading:(NSURLConnection *)connection; connectionWithRequest使用起来比较繁琐,而iOS5.0之前用不支持sendAsynchronousRequest。有网友提出了[AEURLConnection](https://github.com/adamjernst/AEURLConnection)解决方案。 ~~~ AEURLConnection is a simple reimplementation of the API for use on iOS 4. Used properly, it is also guaranteed to be safe against The Deallocation Problem, a thorny threading issue that affects most other networking libraries. ~~~ **2、同步请求** 同步请求数据方法如下: ~~~ - (void)httpSynchronousRequest{ NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]]; NSURLResponse * response = nil; NSError * error = nil; NSData * data = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error]; if (error == nil) { // 处理数据 } } ~~~ 同步请求数据会造成主线程阻塞,通常在请求大数据或网络不畅时不建议使用。 从上面的代码可以看出,不管同步请求还是异步请求,建立通信的步骤基本是一样的: 1、创建NSURL 2、创建Request对象 3、创建NSURLConnection连接。 NSURLConnection创建成功后,就创建了一个http连接。异步请求和同步请求的区别是:创建了异步请求,用户可以做其他的操作,请求会在另一个线程执行,通信结果及过程会在回调函数中执行。同步请求则不同,需要请求结束用户才能做其他的操作。