亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS中使用NSURLConnection處理HTTP同步與異步請求

2020-07-26 03:18:59
字體:
來源:轉載
供稿:網友

一、引言

在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(@"繼續執行");
打印信息如下圖所示,從中可以看出,當數據返回結束時才執行后面的代碼:

20167491116117.png (425×108)

三、使用NSURLConnection進行異步請求

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

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

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
使用如下的代碼進行請求:

    _data = [[NSMutableData alloc]init];
    NSURL * url = [NSURL URLWithString:@"http://www.baidu.com"];
    NSURLRequest * request = [NSURLRequest requestWithURL:url];
    [NSURLConnection connectionWithRequest:request delegate:self];
請求發出后,會一次調用如下代理方法進行請求過程的監聽和數據的獲?。?/p>

-(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);
}

四、示例
1.通過NSURLConnection進行異步下載:  
NSURLConnection 提供了兩種方式來實現連接,一種是同步的另一種是異步的,異步的連接將會創建一個新的線程,這個線程將會來負責下載的動作。而對于同步連接,在下載連接和處理通訊時,則會阻塞當前調用線程。
許多開發者都會認為同步的連接將會堵塞主線程,其實這種觀點是錯誤的。一個同步的連接是會阻塞調用它的線程。如果你在主線程中創建一個同步連接,沒錯,主線程會阻塞。但是如果你并不是從主線程開啟的一個同步的連接,它將會類似異步的連接一樣。因此這種情況并不會堵塞你的主線程。事實上,同步和異步的主要區別就是運行 runtime 為會異步連接創建一個線程,而同步連接則不會。

//asynchronousRequest connection 
-(void)fetchAppleHtml{ 
    NSString *urlString = @"http://www.apple.com"; 
    NSURL *url = [NSURL URLWithString:urlString]; 
//    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url]; 
    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:30.0f]; //maximal timeout is 30s 
     
    NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
    [NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 
        if ([data length] > 0 && connectionError == nil) { 
            NSString *documentsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
            NSString *filePath = [documentsDir stringByAppendingPathComponent:@"apple.html"]; 
            [data writeToFile:filePath atomically:YES]; 
            NSLog(@"Successfully saved the file to %@",filePath); 
            NSString *html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
            NSLog(@"HTML = %@",html); 
        }else if ([data length] == 0 && connectionError == nil){ 
            NSLog(@"Nothing was downloaded."); 
        }else if (connectionError != nil){ 
            NSLog(@"Error happened = %@",connectionError); 
        } 
    }]; 

2.通過NSURLConnection進行同步下載:
使用 NSURLConnection 的 sendSynchronousRequest:returningResponse:error:類方法,我們可以進行同步請求。在創建一個同步的網絡連接的時候我們需要明白一點,并不是是我們的這個同步連接一定會堵塞我們的主線程,如果這個同步的連接是創建在主線程上的,那么這種情況下是會堵塞我們的主線程的,其他的情況下是不一定會堵塞我們的主線程的。如果你在 GCD 的全局并發隊列上初始化了一個同步的連接,你其實并不會堵塞我們的主線程的。
我們來初始化第一個同步連接,并看看會發生什么。在實例中,我們將嘗試獲取 Yahoo!美國站點主頁內容:

//synchronousRequest connection 
-(void)fetchYahooData{ 
    NSLog(@"We are here..."); 
    NSString *urlString = @"http://www.yahoo.com"; 
    NSURL *url = [NSURL URLWithString:urlString]; 
    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url]; 
    NSURLResponse *response = nil; 
    NSError *error = nil; 
    NSLog(@"Firing synchronous url connection..."); 
    NSData *data = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error]; 
    if ([data length] > 0 && error == nil) { 
        NSLog(@"%lu bytes of data was returned.",(unsigned long)[data length]); 
    }else if([data length] == 0 && error == nil){ 
        NSLog(@"No data was return."); 
    }else if (error != nil){ 
        NSLog(@"Error happened = %@",error); 
    } 
    NSLog(@"We are done."); 
     

/*
 |
 | as we know, it will chock main thread when we call sendSynchronousRequest on main thread,,,,change below
 |
 v
*/ 
//call sendSynchronousRequest on GCD pool 
-(void)fetchYahooData2_GCD{ 
    NSLog(@"We are here..."); 
    NSString *urlString = @"http://www.yahoo.com"; 
    NSLog(@"Firing synchronous url connection..."); 
    dispatch_queue_t dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
    dispatch_async(dispatchQueue, ^{ 
        NSURL *url = [NSURL URLWithString:urlString]; 
        NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url]; 
        NSURLResponse *response = nil; 
        NSError *error = nil; 
        NSData *data = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error]; 
        if ([data length] > 0 && error == nil) { 
            NSLog(@"%lu bytes of data was returned.",(unsigned long)[data length]); 
        }else if ([data length] == 0 && error == nil){ 
            NSLog(@"No data was returned."); 
        }else if (error != nil){ 
            NSLog(@"Error happened = %@",error); 
        } 
    }); 
    NSLog(@"We are done."); 
 

查看運行輸出結果,分別為:
synchronous download on main thread without GCD

20167491155165.jpg (573×58)

synchronous download on main thread with GCD

20167491216196.jpg (571×65)

可以看到在主線程上調用同步下載會阻塞當前線程,而使用GCD則不會。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩免费在线观看视频| 久久影视电视剧凤归四时歌| 国产日韩欧美视频在线| 国产精品一区二区久久精品| 日韩av在线免费| 国产精品www色诱视频| 91九色综合久久| 日韩成人高清在线| 亚洲天堂精品在线| 日韩在线视频播放| 韩国三级日本三级少妇99| 国产精品999| 亚洲天堂一区二区三区| 精品亚洲一区二区三区在线播放| 国产精品入口尤物| 欧美成人午夜免费视在线看片| 亚洲网在线观看| 在线电影欧美日韩一区二区私密| 日韩在线观看免费全| 国产精品一区电影| 国产成人在线视频| 色综合久久88| 一区二区三区回区在观看免费视频| 亚洲精品日韩在线| 海角国产乱辈乱精品视频| 欧美激情xxxxx| 97超视频免费观看| 国产精品av网站| 国产色视频一区| 亚洲精品乱码久久久久久按摩观| 久久久久国产精品www| 久久精品国产久精国产思思| 亚洲第一精品电影| 国产热re99久久6国产精品| 亚洲欧美一区二区精品久久久| 91精品在线观看视频| 国产精品91免费在线| 热re99久久精品国产66热| 国产成人精品久久久| 亚洲精品美女在线观看播放| 黑人极品videos精品欧美裸| 日韩高清中文字幕| 国产一区二区日韩精品欧美精品| 日韩精品久久久久久福利| 色在人av网站天堂精品| 最近2019中文字幕大全第二页| 日本欧美爱爱爱| 亚洲a中文字幕| 日本视频久久久| 欧美精品免费看| 国产精品一区二区久久| 免费99精品国产自在在线| 日韩成人在线免费观看| 成人观看高清在线观看免费| 亚洲专区在线视频| 欧美伊久线香蕉线新在线| 亚州欧美日韩中文视频| 久久久久久久一区二区| 亚洲美女中文字幕| 精品视频一区在线视频| 国产有码一区二区| 日韩精品丝袜在线| 国产精品永久免费视频| 亚洲品质视频自拍网| 欧美与欧洲交xxxx免费观看| 国产美女精品免费电影| 爱福利视频一区| 久久精品国产2020观看福利| 96国产粉嫩美女| 国产福利精品视频| 久久99国产精品自在自在app| 成人天堂噜噜噜| 欧美一级成年大片在线观看| 中文国产亚洲喷潮| 91在线观看免费观看| 亚洲性线免费观看视频成熟| 美女福利精品视频| 亚洲第一区第二区| 97成人在线视频| 欧美精品成人在线| 亚洲欧美综合图区| 国产精品九九久久久久久久| 亚洲人高潮女人毛茸茸| 亚洲成人网在线| 欧美极品少妇xxxxⅹ裸体艺术| 黄网动漫久久久| 在线国产精品视频| 中文字幕亚洲国产| 亚洲欧美变态国产另类| 日本乱人伦a精品| 亚洲欧美中文日韩在线v日本| 久久激情视频久久| 欧美人在线观看| 欧美日韩国产成人| 日韩欧美高清在线视频| 国产精品久久久久免费a∨| 国产黑人绿帽在线第一区| 欧美大码xxxx| 日韩免费电影在线观看| 福利二区91精品bt7086| 欧美网站在线观看| 亚洲free性xxxx护士hd| 国产精品r级在线| 欧美激情精品在线| 亚洲视频精品在线| 欧美性极品xxxx娇小| 国产精品www| 亚洲性无码av在线| 久久视频国产精品免费视频在线| 国产精品久久久久久久app| 日韩精品在线第一页| 91精品国产九九九久久久亚洲| 亚洲欧美激情在线视频| 欧美一级电影久久| 岛国av一区二区| xxxx欧美18另类的高清| 91在线高清免费观看| 亚洲视频在线免费观看| 欧美老少做受xxxx高潮| 久久精品国产成人精品| 久久精品成人欧美大片| 国产精品综合网站| 欧美在线视频一区二区| 久久精品成人欧美大片| 亚洲黄色www| 久久影视免费观看| 最新国产成人av网站网址麻豆| 欧美丰满片xxx777| 成人福利网站在线观看11| 国产日韩中文字幕| 国产女人精品视频| 欧美一级淫片videoshd| 久久亚洲一区二区三区四区五区高| 久久久久久美女| 欧美精品在线免费| 日韩电影免费观看中文字幕| 国产精品自产拍在线观| 狠狠色狠色综合曰曰| 欧美性受xxx| 精品综合久久久久久97| 精品国产拍在线观看| 国产精品日日做人人爱| 国产在线播放91| 中国china体内裑精亚洲片| 国产精品成人va在线观看| 久久成人18免费网站| 久久久久九九九九| 精品中文字幕在线观看| 国产精品成熟老女人| 亚洲精品自产拍| 国产91精品久久久久| 精品电影在线观看| 亚洲精品小视频| 精品一区二区三区四区| 亚洲欧美日韩天堂| 成人免费激情视频| 亚洲男女自偷自拍图片另类| 久久精品99久久香蕉国产色戒| 深夜福利一区二区| 国产成人一区二区三区小说| 日韩免费av一区二区| 亚洲综合在线中文字幕| 色偷偷亚洲男人天堂| 国产suv精品一区二区|