NSURLConnection在iOS7之后基本被NSURLSession,但为了兼容,有必要学习一下。
网络请求分为同步和异步两种:
- 同步是指在请求结果返回之前,程序代码会卡在请求处,之后的代码不会被执行,请求返回结果后,之后的代码再执行。
- 异步是指在发送请求之后,一边在子线程中接收返回数据,一边执行之后的代码,当返回数据接收完毕后,采用回调的方式通知主线程做处理。
一、NSURLConnection同步请求
// 同步
- (void)tongbu {
NSURL * url = [NSURL URLWithString:@"https://www.baidu.com"];
NSURLRequest * request = [NSURLRequest requestWithURL:url];
NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSLog(@"%@",data);
NSLog(@"继续执行");
}
而、NSURLConnection异步请求
- block方式的异步请求
// block的异步
- (void)yibu {
NSURL * url = [NSURL URLWithString:@"https://www.baidu.com"];
NSURLRequest * request = [NSURLRequest requestWithURL:url];
//其中的queue参数决定block中的代码在哪个队列中执行
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
NSLog(@"%@",data);
}];
NSLog(@"继续执行");
}
- 代理回调方式的异步请求
采用协议和声明一个用户接受数据的可变NSData:
@interface ViewController ()<NSURLConnectionDataDelegate>
{
NSMutableData * _data;
}
请求代码:
// 代理回调的异步
- (void)yibu_delegate {
_data = [[NSMutableData alloc]init];
NSURL * url = [NSURL URLWithString:@"https://www.baidu.com"];
NSURLRequest * request = [NSURLRequest requestWithURL:url];
[NSURLConnection connectionWithRequest:request delegate:self];
}
实现代理方法:
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
//开始接收数据
[_data setLength:0];
NSLog(@"%s","开始接收数据");
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
//正在接收数据
[_data appendData:data];
NSLog(@"%s","正在接收数据");
}
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
//接收数据失败
NSLog(@"%@",error);
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
//接收数据完成
NSLog(@"%@",_data);
}