NSURLConnection在iOS7之后基本被NSURLSession栖忠,但為了兼容刊懈,有必要學(xué)習(xí)一下。
網(wǎng)絡(luò)請(qǐng)求分為同步和異步兩種:
- 同步是指在請(qǐng)求結(jié)果返回之前娃闲,程序代碼會(huì)卡在請(qǐng)求處,之后的代碼不會(huì)被執(zhí)行匾浪,請(qǐng)求返回結(jié)果后皇帮,之后的代碼再執(zhí)行。
- 異步是指在發(fā)送請(qǐng)求之后蛋辈,一邊在子線程中接收返回?cái)?shù)據(jù)属拾,一邊執(zhí)行之后的代碼,當(dāng)返回?cái)?shù)據(jù)接收完畢后冷溶,采用回調(diào)的方式通知主線程做處理渐白。
一、NSURLConnection同步請(qǐng)求
// 同步
- (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(@"繼續(xù)執(zhí)行");
}
而逞频、NSURLConnection異步請(qǐng)求
- block方式的異步請(qǐng)求
// block的異步
- (void)yibu {
NSURL * url = [NSURL URLWithString:@"https://www.baidu.com"];
NSURLRequest * request = [NSURLRequest requestWithURL:url];
//其中的queue參數(shù)決定block中的代碼在哪個(gè)隊(duì)列中執(zhí)行
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
NSLog(@"%@",data);
}];
NSLog(@"繼續(xù)執(zhí)行");
}
- 代理回調(diào)方式的異步請(qǐng)求
采用協(xié)議和聲明一個(gè)用戶接受數(shù)據(jù)的可變NSData:
@interface ViewController ()<NSURLConnectionDataDelegate>
{
NSMutableData * _data;
}
請(qǐng)求代碼:
// 代理回調(diào)的異步
- (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];
}
實(shí)現(xiàn)代理方法:
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
//開始接收數(shù)據(jù)
[_data setLength:0];
NSLog(@"%s","開始接收數(shù)據(jù)");
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
//正在接收數(shù)據(jù)
[_data appendData:data];
NSLog(@"%s","正在接收數(shù)據(jù)");
}
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
//接收數(shù)據(jù)失敗
NSLog(@"%@",error);
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
//接收數(shù)據(jù)完成
NSLog(@"%@",_data);
}