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

首頁 > 學院 > 開發設計 > 正文

IOS開發--網絡篇-->NSURLConnection基本使用

2019-11-14 19:28:20
字體:
來源:轉載
供稿:網友

iOS開發網絡篇—NSURLConnection基本使用

一、NSURLConnection的常用類

(1)NSURL請求地址

(2)NSURLRequest封裝一個請求,保存發給服務器的全部數據,包括一個NSURL對象,請求方法、請求頭、請求體....

(3)NSMutableURLRequestNSURLRequest的子類

(4)NSURLConnection負責發送請求,建立客戶端和服務器的連接。發送NSURLRequest的數據給服務器,并收集來自服務器的響應數據

 

二、NSURLConnection的使用
1.簡單說明

使用NSURLConnection發送請求的步驟很簡單

(1)創建一個NSURL對象,設置請求路徑(設置請求路徑)

(2)傳入NSURL創建一個NSURLRequest對象,設置請求頭和請求體(創建請求對象)

(3)使用NSURLConnection發送NSURLRequest(發送請求)

2.代碼示例

(1)發送請求的三個步驟

1.設置請求路徑
2.創建請求對象
3.發送請求
3.1發送同步請求(一直在等待服務器返回數據,這行代碼會卡住,如果服務器,沒有返回數據,那么在主線程UI會卡住不能繼續執行操作)有返回值
3.2發送異步請求:沒有返回值
說明:任何NSURLRequest默認都是get請求。
 
(2)發送同步請求代碼示例:
復制代碼
 1 // 2 //  YYViewController.m 3 //  01-NSURLConnection的使用(GET) 4 // 5 //  Created by apple on 14-6-28. 6 //  Copyright (c) 2014年 itcase. All rights reserved. 7 // 8  9 #import "YYViewController.h"10 #import "MB11 12 @interface YYViewController ()13 @property (weak, nonatomic) IBOutlet UITextField *username;14 @property (weak, nonatomic) IBOutlet UITextField *pwd;15 - (IBAction)login;16 17 @end18 19 @implementation YYViewController20 21 - (IBAction)login {22 //    1.提前的表單驗證23     if (self.username.text.length==0) {24         [MBProgressHUD showError:@"請輸入用戶名"];25         return;26     }27     if (self.pwd.text.length==0) {28         [MBProgressHUD showError:@"請輸入密碼"];29         return;30     }31 //    2.發送請求給服務器(帶上賬號和密碼)32     //添加一個遮罩,禁止用戶操作33 //    [MBProgressHUD showMessage:@"正在努力加載中...."];34 //    GET請求:請求行/請求頭/請求體35 //36 //    1.設置請求路徑37     NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text];38     NSURL *url=[NSURL URLWithString:urlStr];39 //    2.創建請求對象40     NSURLRequest *request=[NSURLRequest requestWithURL:url];41 //    3.發送請求42     //發送同步請求,在主線程執行43     NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];44     //(一直在等待服務器返回數據,這行代碼會卡住,如果服務器沒有返回數據,那么在主線程UI會卡住不能繼續執行操作)45     NSLog(@"--%d--",data.length);46 }47 @end
復制代碼

模擬器情況:

打印服務器返回的信息:

補充說明:
1.提前的表單驗證
2.發送請求給服務器(帶上賬號和密碼)
GET請求:請求行/請求頭/請求體
注意:GET請求中不存在請求體,因為所有的信息都寫在URL里面。在IOS里面,請求行和請求頭都不用寫
 
(3)發送異步請求
發送異步請求有兩種方式
1)使用block回調
2)代理
A.使用block回調方法發送異步請求
使用block回調代碼示例:
復制代碼
 1 // 2 //  YYViewController.m 3 //  01-NSURLConnection的使用(GET) 4 // 5 //  Created by apple on 14-6-28. 6 //  Copyright (c) 2014年 itcase. All rights reserved. 7 // 8  9 #import "YYViewController.h"10 #import "MBProgressHUD+MJ.h"11 12 @interface YYViewController ()13 @property (weak, nonatomic) IBOutlet UITextField *username;14 @property (weak, nonatomic) IBOutlet UITextField *pwd;15 - (IBAction)login;16 17 @end18 19 @implementation YYViewController20 21 - (IBAction)login {22 //    1.提前的表單驗證23     if (self.username.text.length==0) {24         [MBProgressHUD showError:@"請輸入用戶名"];25         return;26     }27     if (self.pwd.text.length==0) {28         [MBProgressHUD showError:@"請輸入密碼"];29         return;30     }31 //    2.發送請求給服務器(帶上賬號和密碼)32     //添加一個遮罩,禁止用戶操作33     [MBProgressHUD showMessage:@"正在努力加載中...."];34 35 //36 //    1.設置請求路徑37     NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text];38     NSURL *url=[NSURL URLWithString:urlStr];39     40 //    2.創建請求對象41     NSURLRequest *request=[NSURLRequest requestWithURL:url];42     43 //    3.發送請求44     //3.1發送同步請求,在主線程執行45 //    NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];46     //(一直在等待服務器返回數據,這行代碼會卡住,如果服務器沒有返回數據,那么在主線程UI會卡住不能繼續執行操作)47     48     //3.1發送異步請求49     //創建一個隊列(默認添加到該隊列中的任務異步執行)50 //    NSOperationQueue *queue=[[NSOperationQueue alloc]init];51     //獲取一個主隊列52     NSOperationQueue *queue=[NSOperationQueue mainQueue];53     [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {54         NSLog(@"--block回調數據--%@---%d", [NSThread currentThread],data.length);55         //隱藏HUD,刷新UI的操作一定要放在主線程執行56         [MBProgressHUD hideHUD];57         58         //解析data59         /*60         {"success":"登錄成功"}61         {"error":"用戶名不存在"}62         {"error":"密碼不正確"}63          */64         NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];65         NSLog(@"%@",dict);66         67         //判斷后,在界面提示登錄信息68         NSString *error=dict[@"error"];69         if (error) {70             [MBProgressHUD showError:error];71         }else72         {73             NSString *success=dict[@"success"];74             [MBProgressHUD showSuccess:success];75         }76     }];77     NSLog(@"請求發送完畢");78 }79 @end
復制代碼

模擬器情況(注意這里使用了第三方框架):

打印查看:

代碼說明:
block代碼段:當服務器有返回數據的時候調用會開一條新的線程去發送請求,主線程繼續往下走,當拿到服務器的返回數據的數據的時候再回調block,執行block代碼段。這種情況不會卡住主線程。
隊列的作用:決定這個block操作放在哪個線程執行?
刷新UI界面的操作應該放在主線程執行,不能放在子線程,在子線程處理UI相關操作會出現一些莫名的問題。
提示
(1)創建一個操作,放在NSOperation隊列中執行,默認是異步執行的。
(2)mainqueue   返回一個和主線程相關的隊列,即主隊列。
 
新的問題:如果向服務器發送請求,卻并沒有拿到數據,那么程序會崩潰(data不能為空
改進代碼:
復制代碼
 1  NSOperationQueue *queue=[NSOperationQueue mainQueue]; 2     [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 3         //當請求結束的時候調用(有兩種結果,一個是成功拿到數據,也可能沒有拿到數據,請求失?。?4         NSLog(@"--block回調數據--%@---%d", [NSThread currentThread],data.length); 5         //隱藏HUD,刷新UI的操作一定要放在主線程執行 6         [MBProgressHUD hideHUD]; 7          8         //解析data 9         /*10         {"success":"登錄成功"}11         {"error":"用戶名不存在"}12         {"error":"密碼不正確"}13          */14         if (data) {//請求成功15             NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];16             NSLog(@"%@",dict);17             18             //判斷后,在界面提示登錄信息19             NSString *error=dict[@"error"];20             if (error) {21                 [MBProgressHUD showError:error];22             }else23             {24                 NSString *success=dict[@"success"];25                 [MBProgressHUD showSuccess:success];26             }27         }else   //請求失敗28         {29             [MBProgressHUD showError:@"網絡繁忙,請稍后重試!"];30         }31      32     }];
復制代碼
解析data
   //解析data        /*        {"success":"登錄成功"}        {"error":"用戶名不存在"}        {"error":"密碼不正確"}         */
說明:使用NSJSONSerialization 返回的對象,取決于最外層是什么,如果是{}那就是字典,[]那就是數組等。
補充說明:
首先確定請求路徑,然后創建請求對象(默認發送的時get請求),使用異步方法(一調用這個方法,它會自動開啟一個子線程去發送請求,當請求成功,數據返回的時候自動調用內部的代碼段,這個代碼段在那個線程執行取決于隊列,如果是主隊列,那么在子線程發送請求成功拿到服務器的數據后,回到主線程中解析數據,刷新UI界面)。
 
B.使用代理方法發送異步請求

要監聽服務器返回的data,所以使用<NSURLConnectionDataDelegate>協議

常見大代理方法如下:

復制代碼
 1 #pragma mark- NSURLConnectionDataDelegate代理方法 2  3 //當接收到服務器的響應(連通了服務器)時會調用 4  5 -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 6  7 //當接收到服務器的數據時會調用(可能會被調用多次,每次只傳遞部分數據) 8  9 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data10 11 //當服務器的數據加載完畢時就會調用12 13 -(void)connectionDidFinishLoading:(NSURLConnection *)connection14 15 //請求錯誤(失?。┑臅r候調用(請求超時/斷網/沒有網/,一般指客戶端錯誤)16 17 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
復制代碼

使用異步方法發送get請求的代碼示例:

 

復制代碼
  1 //  2 //  YYViewController.m  3 //  01-NSURLConnection的使用(GET)  4 //  5 //  Created by apple on 14-6-28.  6 //  Copyright (c) 2014年 itcase. All rights reserved.  7 //  8   9 #import "YYViewController.h" 10 #import "MBProgressHUD+MJ.h" 11  12 @interface YYViewController ()<NSURLConnectionDataDelegate> 13 @property (weak, nonatomic) IBOutlet UITextField *username; 14 @property (weak, nonatomic) IBOutlet UITextField *pwd; 15 @property(nonatomic,strong)NSMutableData *responseData; 16 - (IBAction)login; 17  18 @end 19  20 @implementation YYViewController 21  22 - (IBAction)login { 23 //    1.提前的表單驗證 24     if (self.username.text.length==0) { 25         [MBProgressHUD showError:@"請輸入用戶名"]; 26         return; 27     } 28     if (self.pwd.text.length==0) { 29         [MBProgressHUD showError:@"請輸入密碼"]; 30         return; 31     } 32 //    2.發送請求給服務器(帶上賬號和密碼) 33     //添加一個遮罩,禁止用戶操作 34     [MBProgressHUD showMessage:@"正在努力加載中...."]; 35  36 // 37 //   2.1設置請求路徑 38     NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text]; 39     NSURL *url=[NSURL URLWithString:urlStr]; 40      41 //   2.2創建請求對象 42 //    NSURLRequest *request=[NSURLRequest requestWithURL:url];//默認就是GET請求 43     //設置請求超時 44     NSMutableURLRequest *request=[NSMutableURLRequest  requestWithURL:url]; 45     request.timeoutInterval=5.0; 46      47 //   2.3.發送請求 48  //使用代理發送異步請求(通常應用于文件下載) 49     NSURLConnection *conn=[NSURLConnection connectionWithRequest:request delegate:self]; 50     [conn start]; 51     NSLog(@"已經發出請求---"); 52 } 53  54 #pragma mark- NSURLConnectionDataDelegate代理方法 55 /* 56  *當接收到服務器的響應(連通了服務器)時會調用 57  */ 58 -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 59 { 60     NSLog(@"接收到服務器的響應"); 61     //初始化數據 62     self.responseData=[NSMutableData data]; 63 } 64  65 /* 66 *當接收到服務器的數據時會調用(可能會被調用多次,每次只傳遞部分數據) 67 */ 68 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 69 { 70     NSLog(@"接收到服務器的數據"); 71     //拼接數據 72     [self.responseData appendData:data]; 73         NSLog(@"%d---%@--",self.responseData.length,[NSThread currentThread]); 74 } 75  76 /* 77  *當服務器的數據加載完畢時就會調用 78  */ 79 -(void)connectionDidFinishLoading:(NSURLConnection *)connection 80 { 81     NSLog(@"服務器的數據加載完畢"); 82     //隱藏HUD 83     [MBProgressHUD hideHUD]; 84      85     //處理服務器返回的所有數據 86     NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:self.responseData options:NSJSONReadingMutableLeaves error:nil]; 87      88     //判斷后,在界面提示登錄信息 89     NSString *error=dict[@"error"]; 90     if (error) { 91         [MBProgressHUD showError:error]; 92     }else 93     { 94         NSString *success=dict[@"success"]; 95         [MBProgressHUD showSuccess:success]; 96     } 97     NSLog(@"%d---%@--",self.responseData.length,[NSThread currentThread]); 98 } 99 /*100  *請求錯誤(失?。┑臅r候調用(請求超時/斷網/沒有網/,一般指客戶端錯誤)101  */102 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error103 {104 //     NSLog(@"請求錯誤");105     //隱藏HUD106     [MBProgressHUD hideHUD];107     [MBProgressHUD showError:@"網絡繁忙,請稍后重試!"];108 }109 @end
復制代碼

 

打印查看:

 

補充:

(1)數據的處理

在didReceiveData:方法中,拼接接收到的所有數據,等所有數據都拿到后,在connectionDidFinishLoading:方法中進行處理

(2)網絡延遲

在做網絡開發的時候,一定要考慮到網絡延遲情況的處理,可以在服務器的代碼設置一個斷點模擬。

在服務器代碼的登錄方法中設置斷點

設置請求的最大延遲

 

模擬器情況:

打印查看:

三、NSMutableURLRequest

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

設置請求超時等待時間(超過這個時間就算超時,請求失敗)- (void)setTimeoutInterval:(NSTimeInterval)seconds;

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

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

設置請求頭- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;

 

 
 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧洲成人午夜免费大片| 亚洲精品理论电影| 精品久久久国产精品999| 国产亚洲欧洲在线| 成人夜晚看av| 日韩欧美成人精品| 97人人模人人爽人人喊中文字| 亚洲精品久久久久国产| 色悠悠久久久久| 中文在线不卡视频| 欧美激情在线一区| 亚洲国产第一页| 亚洲综合中文字幕68页| 日韩av在线免费播放| 国产成人一区二| 亚洲一区二区少妇| 亚洲肉体裸体xxxx137| 国产精品亚洲аv天堂网| 91天堂在线观看| 91精品啪aⅴ在线观看国产| 欧美精品九九久久| 精品福利在线看| 久久精品国产一区二区三区| 成人日韩av在线| 高清一区二区三区日本久| 亚洲成人精品av| 欧美日韩国产va另类| 成人黄色午夜影院| 最好看的2019的中文字幕视频| 久久久精品一区二区| 欧美高清在线观看| 国产精品一区二区电影| 国内精品一区二区三区| 色琪琪综合男人的天堂aⅴ视频| 亚洲精品少妇网址| 久久偷看各类女兵18女厕嘘嘘| 欧美成人亚洲成人日韩成人| 北条麻妃99精品青青久久| 精品久久久久久中文字幕大豆网| 狠狠色狠狠色综合日日小说| 欧美国产精品va在线观看| 精品调教chinesegay| 久久久视频精品| 精品视频一区在线视频| 97热在线精品视频在线观看| 日韩欧美精品网址| 久久久伊人欧美| 在线a欧美视频| 亚洲高清不卡av| 最近2019中文字幕mv免费看| 91国内在线视频| 日韩欧美一区二区三区| 久久久黄色av| 伊人一区二区三区久久精品| 亚洲欧美精品一区二区| 国产综合久久久久久| 精品国产1区2区| 欧美日韩福利在线观看| 欧美乱大交做爰xxxⅹ性3| 人人做人人澡人人爽欧美| 欧美极品少妇xxxxⅹ裸体艺术| 色噜噜国产精品视频一区二区| www亚洲欧美| 亚洲高清在线观看| 国产精品吹潮在线观看| 中文字幕日韩高清| 国产精品电影网站| 日韩欧美在线播放| 亚洲精品wwww| 亚洲成人网在线观看| 成人黄色在线免费| 爽爽爽爽爽爽爽成人免费观看| 亚洲欧美成人一区二区在线电影| 欧美精品videofree1080p| 久久精品99无色码中文字幕| 亚洲精品小视频| 成人午夜一级二级三级| 欧美日韩xxx| 日韩在线资源网| 国产激情久久久| 91久久夜色精品国产网站| 91香蕉嫩草影院入口| 日韩av三级在线观看| 国模叶桐国产精品一区| 国产午夜精品视频| 欧美福利视频网站| 欧美视频一区二区三区…| 亚洲精品国产品国语在线| 懂色av影视一区二区三区| 日韩欧美成人区| 成人啪啪免费看| 亚洲一区www| 九九久久久久99精品| 日韩网站在线观看| 国产欧美一区二区三区在线| 亚洲国产成人精品女人久久久| 亚洲精品国产美女| 57pao成人永久免费视频| 国内精品久久久久| 欧美裸体视频网站| 成人情趣片在线观看免费| 97国产精品视频| 国产精品十八以下禁看| 日韩av片免费在线观看| 成人免费在线视频网站| 国产精品日韩欧美综合| 国产欧美日韩综合精品| 国产成人精品久久| 日本精品中文字幕| 成人字幕网zmw| 国产精品久久一区主播| 在线观看国产成人av片| 欧美成人午夜剧场免费观看| 中国china体内裑精亚洲片| 色妞色视频一区二区三区四区| 成人美女免费网站视频| 欧美电影在线观看完整版| 深夜福利亚洲导航| 一本色道久久综合狠狠躁篇怎么玩| 国产欧美亚洲视频| 国产精品69久久| 亚洲美女黄色片| 久久久久国产精品免费| 97人洗澡人人免费公开视频碰碰碰| 欧美成年人在线观看| 国内免费久久久久久久久久久| 97在线视频免费看| 欧美视频在线观看免费网址| 国产视频精品一区二区三区| 欧美亚洲国产成人精品| 亚洲性生活视频| 国产精品精品一区二区三区午夜版| 亚洲视频综合网| 国产xxx69麻豆国语对白| 国产精品久久久久久av下载红粉| 懂色av一区二区三区| 亚洲国产精品视频在线观看| 久久久久久国产精品| 国产欧美一区二区三区在线| 69久久夜色精品国产7777| 国产精品美女999| 亚洲成人xxx| 欧美日韩另类视频| 理论片在线不卡免费观看| 亚洲色图日韩av| 国产亚洲人成a一在线v站| 黑人极品videos精品欧美裸| 中文字幕9999| 国产99久久精品一区二区 夜夜躁日日躁| 欧美在线亚洲在线| 国产亚洲视频在线观看| 国产主播欧美精品| 69**夜色精品国产69乱| 欧美成人免费播放| 日韩欧美国产网站| 欧美精品激情视频| 久久在线观看视频| 视频直播国产精品| 欧美激情精品久久久久久变态| 久操成人在线视频| 日本高清+成人网在线观看| 91久久久亚洲精品| 亚洲欧美日韩精品| 欧美日韩亚洲一区二区三区|