iOS網(wǎng)絡(luò)請求-NSURLConnection

一、NSURLConnection的常用類

NSURL:請求地址
NSURLRequest:封裝一個(gè)請求,保存發(fā)給服務(wù)器的全部數(shù)據(jù),包括一個(gè)NSURL對象,請求方法、請求頭、請求體....
NSMutableURLRequest:NSURLRequest的子類
NSURLConnection:負(fù)責(zé)發(fā)送請求,建立客戶端和服務(wù)器的連接。發(fā)送NSURLRequest的數(shù)據(jù)給服務(wù)器,并收集來自服務(wù)器的響應(yīng)數(shù)據(jù)

二、NSURLConnection的使用

1、簡單說明

使用NSURLConnection發(fā)送請求的步驟很簡單
(1)創(chuàng)建一個(gè)NSURL對象,設(shè)置請求路徑(設(shè)置請求路徑)
(2)傳入NSURL創(chuàng)建一個(gè)NSURLRequest對象,設(shè)置請求頭和請求體(創(chuàng)建請求對象)
(3)使用NSURLConnection發(fā)送NSURLRequest(發(fā)送請求)


2、代碼示例

2.1、發(fā)送請求的三個(gè)步驟:

1.設(shè)置請求路徑
2.創(chuàng)建請求對象
3.發(fā)送請求
3.1發(fā)送同步請求(一直在等待服務(wù)器返回?cái)?shù)據(jù),這行代碼會卡住,如果服務(wù)器,沒有返回?cái)?shù)據(jù),那么在主線程UI會卡住不能繼續(xù)執(zhí)行操作)有返回值
3.2發(fā)送異步請求:沒有返回值
說明:任何NSURLRequest默認(rèn)都是get請求。

2.2、發(fā)送同步請求:
  //1.設(shè)置請求路徑
    NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text];
    NSURL *url=[NSURL URLWithString:urlStr];
    
  //2.創(chuàng)建請求對象
    NSURLRequest *request=[NSURLRequest requestWithURL:url];
    
  //3.發(fā)送請求
    //發(fā)送同步請求,在主線程執(zhí)行
    NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    //(一直在等待服務(wù)器返回?cái)?shù)據(jù),這行代碼會卡住,如果服務(wù)器沒有返回?cái)?shù)據(jù),那么在主線程UI會卡住不能繼續(xù)執(zhí)行操作)
    
NSLog(@"--%d--",data.length);
2.3、發(fā)送異步請求

發(fā)送異步請求有兩種方式:
1)使用block回調(diào)
2)代理
A.使用block回調(diào)方法發(fā)送異步請求
使用block回調(diào)代碼示例:

  //1.設(shè)置請求路徑
    NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text];
    NSURL *url=[NSURL URLWithString:urlStr];
    
  //2.創(chuàng)建請求對象
    NSURLRequest *request=[NSURLRequest requestWithURL:url];
     
  //3.發(fā)送請求
    //創(chuàng)建一個(gè)隊(duì)列(默認(rèn)添加到該隊(duì)列中的任務(wù)異步執(zhí)行)
    NSOperationQueue *queue=[[NSOperationQueue alloc]init];
    [NSURLConnection sendAsynchronousRequest:request 
                                       queue:queue 
                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
         
         NSLog(@"--block回調(diào)數(shù)據(jù)--%@---%d", [NSThread currentThread],data.length);
         
         //解析data
         NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
         NSLog(@"%@",dict);
     }];

代碼說明:
block代碼段:當(dāng)服務(wù)器有返回?cái)?shù)據(jù)的時(shí)候調(diào)用會開一條新的線程去發(fā)送請求,主線程繼續(xù)往下走,當(dāng)拿到服務(wù)器的返回?cái)?shù)據(jù)的數(shù)據(jù)的時(shí)候再回調(diào)block,執(zhí)行block代碼段。這種情況不會卡住主線程。
隊(duì)列的作用:決定這個(gè)block操作放在哪個(gè)線程執(zhí)行?
刷新UI界面的操作應(yīng)該放在主線程執(zhí)行,不能放在子線程,在子線程處理UI相關(guān)操作會出現(xiàn)一些莫名的問題。
提示:
(1)創(chuàng)建一個(gè)操作,放在NSOperation隊(duì)列中執(zhí)行,默認(rèn)是異步執(zhí)行的。
(2)mainqueue 返回一個(gè)和主線程相關(guān)的隊(duì)列,即主隊(duì)列。

B.使用代理方法發(fā)送異步請求
要監(jiān)聽服務(wù)器返回的data,所以使用<NSURLConnectionDataDelegate>協(xié)議

使用異步方法發(fā)送get請求的示例:

 - (void)request
{
    //1.設(shè)置請求路徑
    NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text];
    NSURL *url=[NSURL URLWithString:urlStr];
     
    //2創(chuàng)建請求對象
    //NSURLRequest *request=[NSURLRequest requestWithURL:url];//默認(rèn)就是GET請求
     //設(shè)置請求超時(shí)
     NSMutableURLRequest *request = [NSMutableURLRequest  requestWithURL:url];
     request.timeoutInterval = 5.0;
     
    //3.發(fā)送請求
    //使用代理發(fā)送異步請求(通常應(yīng)用于文件下載)
     NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
     [connection start];
     NSLog(@"已經(jīng)發(fā)出請求");
 }
 
 #pragma mark- NSURLConnectionDataDelegate代理方法
 //當(dāng)接收到服務(wù)器的響應(yīng)(連通了服務(wù)器)時(shí)會調(diào)用
 -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
     NSLog(@"接收到服務(wù)器的響應(yīng)");
 }
 
 //當(dāng)接收到服務(wù)器的數(shù)據(jù)時(shí)會調(diào)用(可能會被調(diào)用多次,每次只傳遞部分?jǐn)?shù)據(jù))
 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
     NSLog(@"接收到服務(wù)器的數(shù)據(jù)");
 }
 
//當(dāng)服務(wù)器的數(shù)據(jù)加載完畢時(shí)就會調(diào)用
 -(void)connectionDidFinishLoading:(NSURLConnection *)connection
 {
     NSLog(@"服務(wù)器的數(shù)據(jù)加載完畢");
 }

 //請求錯(cuò)誤(失?。┑臅r(shí)候調(diào)用(請求超時(shí)\斷網(wǎng)\沒有網(wǎng)\,一般指客戶端錯(cuò)誤)
 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
 {
      NSLog(@"請求錯(cuò)誤");
 }

補(bǔ)充:
(1)數(shù)據(jù)的處理
在didReceiveData:方法中,拼接接收到的所有數(shù)據(jù),等所有數(shù)據(jù)都拿到后,在connectionDidFinishLoading:方法中進(jìn)行處理
(2)網(wǎng)絡(luò)延遲
在做網(wǎng)絡(luò)開發(fā)的時(shí)候,一定要考慮到網(wǎng)絡(luò)延遲情況的處理,可以在服務(wù)器的代碼設(shè)置一個(gè)斷點(diǎn)模擬。
在服務(wù)器代碼的登錄方法中設(shè)置斷點(diǎn)



設(shè)置請求的最大延遲


三、NSMutableURLRequest

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

//設(shè)置請求超時(shí)等待時(shí)間(超過這個(gè)時(shí)間就算超時(shí),請求失?。?- (void)setTimeoutInterval:(NSTimeInterval)seconds;

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

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

//設(shè)置請求頭
- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容