天天看點

iOS網絡程式設計之三——NSURLConnection的簡單使用

一、引言

   在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);

繼續閱讀