一、引言
在iOS7後,NSURLSession基本代替了NSURLConnection進行網絡開發,在iOS9後,NSURLConnection相關方法被完全的棄用,iOS系統有向下相容的特性,盡管NSURLConnection已經被棄用,但在開發中,其方法依然可以被使用,并且如果需要相容到很低版本的iOS系統,有時就必須使用NSURLConnection類了。
二、使用NSURLConnection進行同步請求
對于網絡請求分為同步和異步兩種,同步是指在請求結果傳回之前,程式代碼會卡在請求處,之後的代碼不會被執行,異步是指在發送請求之後,一邊在子線程中接收傳回資料,一邊執行之後的代碼,當傳回資料接收完畢後,采用回調的方式通知主線程做處理。
使用如下方法進行NSURLConnection的同步請求:
NSURL * url = [NSURL URLWithString:@"http://www.baidu.com"];
NSURLRequest * request = [NSURLRequest requestWithURL:url];
NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSLog(@"%@",data);
NSLog(@"繼續執行");
列印資訊如下圖所示,從中可以看出,當資料傳回結束時才執行後面的代碼:
iOS網絡程式設計之三——NSURLConnection的簡單使用

三、使用NSURLConnection進行異步請求
使用同步的方式進行請求有一個很大的弊端,在進行網絡請求時,資料的傳回往往需要一定時間,不可能瞬間完成,使用同步的方式将導緻界面卡死,沒有提示也不能互動任何使用者操作,這樣的話,很有可能會給使用者程式卡死的假象。
NSURLConnection類提供兩種方式進行異步請求操作。
1.使用block的方式進行異步請求
使用如下代碼進行block方式的異步請求,在block中會傳入請求到的傳回資料和資料資訊等參數:
//其中的queue參數決定block中的代碼在哪個隊列中執行
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
NSLog(@"%@",data);
}];
2.使用代理回調的異步請求方式
首先遵守協定與生命一個可變的NSData用于接收資料:
@interface ViewController ()<NSURLConnectionDataDelegate>
{
NSMutableData * _data;
}
@end
使用如下的代碼進行請求:
_data = [[NSMutableData alloc]init];
[NSURLConnection connectionWithRequest:request delegate:self];
請求發出後,會一次調用如下代理方法進行請求過程的監聽和資料的擷取:
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
//開始接收資料
[_data setLength:0];
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
//正在接收資料
[_data appendData:data];
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
//接收資料失敗
NSLog(@"%@",error);
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
//接收資料完成
NSLog(@"%@",_data);