iOS網絡編程之三——NSURLConnection的簡單使用

iOS網絡編程之三——NSURLConnection的簡單使用

1、引言

    在iOS7後,NSURLSession基本代替了NSURLConnection進行網絡開發,在iOS9後,NSURLConnection相關方法被徹底的棄用,iOS系統有向下兼容的特性,儘管NSURLConnection已經被棄用,但在開發中,其方法依然能夠被使用,而且若是須要兼容到很低版本的iOS系統,有時就必須使用NSURLConnection類了。編程

2、使用NSURLConnection進行同步請求

    對於網絡請求分爲同步和異步兩種,同步是指在請求結果返回以前,程序代碼會卡在請求處,以後的代碼不會被執行,異步是指在發送請求以後,一邊在子線程中接收返回數據,一邊執行以後的代碼,當返回數據接收完畢後,採用回調的方式通知主線程作處理。網絡

    使用以下方法進行NSURLConnection的同步請求:app

    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(@"繼續執行");

 

打印信息以下圖所示,從中能夠看出,當數據返回結束時才執行後面的代碼:異步

3、使用NSURLConnection進行異步請求

        使用同步的方式進行請求有一個很大的弊端,在進行網絡請求時,數據的返回每每須要必定時間,不可能瞬間完成,使用同步的方式將致使界面卡死,沒有提示也不能交互任何用戶操做,這樣的話,頗有可能會給用戶程序卡死的假象。url

        NSURLConnection類提供兩種方式進行異步請求操做。spa

        1.使用block的方式進行異步請求

        使用以下代碼進行block方式的異步請求,在block中會傳入請求到的返回數據和數據信息等參數:線程

    NSURL * url = [NSURL URLWithString:@"http://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(@"繼續執行");

 

        2.使用代理回調的異步請求方式

        首先遵照協議與生命一個可變的NSData用於接收數據:代理

@interface ViewController ()<NSURLConnectionDataDelegate>
{
    NSMutableData * _data;
}
@end

 

使用以下的代碼進行請求:code

    _data = [[NSMutableData alloc]init];
    NSURL * url = [NSURL URLWithString:@"http://www.baidu.com"];
    NSURLRequest * request = [NSURLRequest requestWithURL:url];
    [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);
}

 

專一技術,熱愛生活,交流技術,也作朋友。

——琿少 QQ羣:203317592

相關文章
相關標籤/搜索