iOS開(kāi)發(fā)-NSURLConnection基本使用


一、NSURLConnection的常用類

(1)NSURL:請(qǐng)求地址

(2)NSURLRequest:封裝一個(gè)請(qǐng)求,保存發(fā)給服務(wù)器的全部數(shù)據(jù),包括一個(gè)NSURL對(duì)象,請(qǐng)求方法、請(qǐng)求頭、請(qǐng)求體....

(3)NSMutableURLRequest:NSURLRequest的子類

(4)NSURLConnection:負(fù)責(zé)發(fā)送請(qǐng)求,建立客戶端和服務(wù)器的連接。發(fā)送NSURLRequest的數(shù)據(jù)給服務(wù)器,并收集來(lái)自服務(wù)器的響應(yīng)數(shù)據(jù)


二、NSURLConnection的使用

使用NSURLConnection發(fā)送請(qǐng)求的步驟很簡(jiǎn)單

(1)創(chuàng)建一個(gè)NSURL對(duì)象,設(shè)置請(qǐng)求路徑(設(shè)置請(qǐng)求路徑)

(2)傳入NSURL創(chuàng)建一個(gè)NSURLRequest對(duì)象,設(shè)置請(qǐng)求頭和請(qǐng)求體(創(chuàng)建請(qǐng)求對(duì)象)

(3)使用NSURLConnection發(fā)送NSURLRequest(發(fā)送請(qǐng)求)


2.代碼示例

(1)發(fā)送請(qǐng)求的三個(gè)步驟:

1.設(shè)置請(qǐng)求路徑

2.創(chuàng)建請(qǐng)求對(duì)象

3.發(fā)送請(qǐng)求

3.1發(fā)送同步請(qǐng)求(一直在等待服務(wù)器返回?cái)?shù)據(jù),這行代碼會(huì)卡住,如果服務(wù)器,沒(méi)有返回?cái)?shù)據(jù),那么在主線程UI會(huì)卡住不能繼續(xù)執(zhí)行操作)有返回值

3.2發(fā)送異步請(qǐng)求:沒(méi)有返回值

說(shuō)明:任何NSURLRequest默認(rèn)都是get請(qǐng)求。

通過(guò)NSURLConnection訪問(wèn)服務(wù)器,三步:

1.設(shè)置請(qǐng)求路徑? 創(chuàng)建一個(gè)URL:統(tǒng)一資源定位符

注意這里一定要加http協(xié)議

NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];

2.創(chuàng)建請(qǐng)求對(duì)象

NSURLRequest *request = [NSURLRequest requestWithURL:url];

3.建立連接,發(fā)送請(qǐng)求

接收數(shù)據(jù)的代理方法

1.建立一個(gè)同步請(qǐng)求(如果數(shù)據(jù)大或者網(wǎng)速慢,請(qǐng)求事件過(guò)長(zhǎng),會(huì)造成主線程阻塞(卡死))

NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

//NSUTF8StringEncoding將data編碼為當(dāng)前語(yǔ)言環(huán)境下的語(yǔ)言

NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

NSLog(@"----------------------%@", str);

NSLog(@"----------繼續(xù)執(zhí)行----------");

//對(duì)于網(wǎng)絡(luò)請(qǐng)求分為同步和異步兩種,同步是指在請(qǐng)求結(jié)果返回之前,程序代碼會(huì)卡在請(qǐng)求處,之后的代碼不會(huì)被執(zhí)行,異步是指在發(fā)送請(qǐng)求之后,一邊在子線程中接收返回?cái)?shù)據(jù),一邊執(zhí)行之后的代碼,當(dāng)返回?cái)?shù)據(jù)接收完畢后,采用回調(diào)的方式通知主線程做處理。


2、建立一個(gè)異步請(qǐng)求

創(chuàng)建隊(duì)列(開(kāi)啟一個(gè)新的線程)

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {

NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

NSLog(@"訪問(wèn)網(wǎng)頁(yè)返回的數(shù)據(jù) ------- %@", str);

dispatch_async(dispatch_get_main_queue(), ^{

[_web loadHTMLString:str baseURL:nil];

});

}];


3.使用代理

? ? [NSURLConnection connectionWithRequest:request delegate:self];

#pragma mark - NSURLConnectionDelegate,NSURLConnectionDataDelegate

當(dāng)你接收到服務(wù)器的響應(yīng)(連通了服務(wù)器)會(huì)調(diào)用,(服務(wù)器告訴客戶端,我這邊準(zhǔn)備好了,可以給你返回?cái)?shù)據(jù)了)

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {

NSLog(@"---------響應(yīng)");

//創(chuàng)建可變數(shù)據(jù)對(duì)象,用來(lái)接收拼接返回的數(shù)據(jù)

_buffer = [[NSMutableData alloc] init];

}

//當(dāng)接收到服務(wù)器發(fā)送的數(shù)據(jù)時(shí)會(huì)調(diào)用,(可能會(huì)被調(diào)用多次,每次只會(huì)傳遞部分?jǐn)?shù)據(jù))

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {

NSLog(@"---------數(shù)據(jù)");

//使用創(chuàng)建的好的buffer對(duì)象接受拼接數(shù)據(jù)

[_buffer appendData:data];

}

當(dāng)數(shù)據(jù)全部接收完畢的時(shí)候會(huì)調(diào)用

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

NSLog(@"---------結(jié)束");

NSString *str = [[NSString alloc] initWithData:_buffer encoding:NSUTF8StringEncoding];

//#pragma unused(str)

}

請(qǐng)求失敗調(diào)用(請(qǐng)求超時(shí),斷網(wǎng),參數(shù)錯(cuò)誤,服務(wù)器出錯(cuò).....)

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)erro {

NSLog(@"請(qǐng)求失敗");

}


NSURLConnection的常用類

(1)NSURL:請(qǐng)求路徑? -- 統(tǒng)一資源定位符

(2)NSURLRequest:請(qǐng)求對(duì)象,保存發(fā)給服務(wù)器的全部數(shù)據(jù),包括一個(gè)NSURL對(duì)象,請(qǐng)求方法、請(qǐng)求頭、請(qǐng)求體....

(3)NSMutableURLRequest:NSURLRequest的子類

(4)NSURLConnection:負(fù)責(zé)發(fā)送請(qǐng)求,建立客戶端和服務(wù)器的連接。發(fā)送NSURLRequest的數(shù)據(jù)給服務(wù)器,并收集來(lái)自服務(wù)器的響應(yīng)數(shù)據(jù)


3.1發(fā)送同步請(qǐng)求(一直在等待服務(wù)器返回?cái)?shù)據(jù),這行代碼會(huì)卡住,如果服務(wù)器,沒(méi)有返回?cái)?shù)據(jù),那么在主線程UI會(huì)卡住不能繼續(xù)執(zhí)行操作)有返回值

3.2發(fā)送異步請(qǐng)求:沒(méi)有返回值

(3)發(fā)送異步請(qǐng)求??? 發(fā)送異步請(qǐng)求有兩種方式:

1)使用block回調(diào)

2)代理???? (例子見(jiàn)下面小Demo)


三、NSMutableURLRequest

NSMutableURLRequest是NSURLRequest的子類,常用方法有

設(shè)置請(qǐng)求超時(shí)等待時(shí)間(超過(guò)這個(gè)時(shí)間就算超時(shí),請(qǐng)求失敗)- (void)setTimeoutInterval:(NSTimeInterval)seconds;

設(shè)置請(qǐng)求方法(比如GET和POST)- (void)setHTTPMethod:(NSString *)method;

設(shè)置請(qǐng)求體- (void)setHTTPBody:(NSData *)data;

設(shè)置請(qǐng)求頭- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;

1.使用block的方式進(jìn)行異步請(qǐng)求

使用如下代碼進(jìn)行block方式的異步請(qǐng)求,在block中會(huì)傳入請(qǐng)求到的返回?cái)?shù)據(jù)和數(shù)據(jù)信息等參數(shù):

NSURL* url = [NSURLURLWithString:@"http://www.baidu.com"];

NSURLRequest* request = [NSURLRequestrequestWithURL:url];

//其中的queue參數(shù)決定block中的代碼在哪個(gè)隊(duì)列中執(zhí)行[NSURLConnectionsendAsynchronousRequest:request queue:[NSOperationQueuemainQueue] completionHandler:^(NSURLResponse* _Nullable response,NSData* _Nullable data,NSError* _Nullable connectionError)

{NSLog(@"%@",data);??

}];

NSLog(@"繼續(xù)執(zhí)行");

2.使用代理回調(diào)的異步請(qǐng)求方式

首先遵守協(xié)議與生命一個(gè)可變的NSData用于接收數(shù)據(jù):

@interfaceViewController (){? ?

NSMutableData * _data;

}

@end

使用如下的代碼進(jìn)行請(qǐng)求:


_data = [[NSMutableDataalloc]init];NSURL* url = [NSURLURLWithString:@"http://www.baidu.com"];NSURLRequest* request = [NSURLRequestrequestWithURL:url];? ? [NSURLConnectionconnectionWithRequest:request delegate:self];

請(qǐng)求發(fā)出后,會(huì)一次調(diào)用如下代理方法進(jìn)行請(qǐng)求過(guò)程的監(jiān)聽(tīng)和數(shù)據(jù)的獲取:

-(void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)response{

//開(kāi)始接收數(shù)據(jù)[_data setLength:0];

}

-(void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data{

//正在接收數(shù)據(jù)[_data appendData:data];

}

-(void)connection:(NSURLConnection*)connection didFailWithError:(NSError*)error{

//接收數(shù)據(jù)失敗NSLog(@"%@",error);

}

-(void)connectionDidFinishLoading:(NSURLConnection*)connection{

//接收數(shù)據(jù)完成NSLog(@"%@",_data);

}


本文能更新的的就這些了,都是一些基礎(chǔ)的代碼案例


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容