這篇文章主要介紹了IOS網(wǎng)絡請求之NSURLSession使用的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

前言:
無論是Android還是ios都離不開與服務器交互,這就必須用到網(wǎng)絡請求,記得在2013年做iOS的時候那時候用的ASIHTTPRequest框架,現(xiàn)在重新?lián)炱餴OS的時候ASIHTTPRequest已經(jīng)停止維護,大家都在用AFNetWorking作為選網(wǎng)絡請求框架,之前的ASIHTTPRequest是基于NSURLConnection類實現(xiàn)的,早期的AFNetWorking也是基于NSURLConnection實現(xiàn),后來iOS9 之后已經(jīng)放棄了NSURLConnection,開始使用iOS 7之后推出的NSURLSession,本著追根溯源的原則,首先學習一下NSURLSession的實現(xiàn)網(wǎng)絡請求,然后再去學習AFNetWorking。
了解NSURLSession
NSURLSession是2013年iOS 7發(fā)布的用于替代NSURLConnection的,iOS 9之后NSURLConnection徹底推出歷史舞臺。其使用起來非常方便,今天使用NSURLConnection分別實現(xiàn)了get、post、表單提交、文件上傳、文件下載,讓我這個以Android開發(fā)為主的屌絲程序員贊嘆不已,根據(jù)NSURLSession會話對象創(chuàng)建一個請求Task,然后執(zhí)行該Task即可,包括緩存、會話周期,多線程任務iOS都已經(jīng)在sdk層面封裝完畢,不過比較遺憾的時NSURLSession只提供了異步請求方式而沒有提供同步請求方式。接下來我們來如何實現(xiàn)網(wǎng)絡請求。
NSURLSession使用
我們首先以一個簡單的get請求為例開始。
1.)首先構造一個NSURL請求資源地址
// 構造URL資源地址 NSURL *url = [NSURL URLWithString:@http://api.nohttp.net/method?name=yanzhenjie&pwd=123];
2.)創(chuàng)建一個NSRequest請求對象
// 創(chuàng)建Request請求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 配置Request請求
// 設置請求方法
[request setHTTPMethod:@"GET"];
// 設置請求超時 默認超時時間60s
[request setTimeoutInterval:10.0];
// 設置頭部參數(shù)
[request addValue:@"gzip" forHTTPHeaderField:@"Content-Encoding"];
//或者下面這種方式 添加所有請求頭信息
request.allHTTPHeaderFields=@{@"Content-Encoding":@"gzip"};
//設置緩存策略
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];根據(jù)需求添加不用的設置,比如請求方式、超時時間、請求頭信息,這里重點介紹下緩存策略:
NSURLRequestUseProtocolCachePolicy = 0 //默認的緩存策略, 如果緩存不存在,直接從服務端獲取。如果緩存存在,會根據(jù)response中的Cache-Control字段判斷下一步操作,如: Cache-Control字段為must-revalidata, 則詢問服務端該數(shù)據(jù)是否有更新,無更新的話直接返回給用戶緩存數(shù)據(jù),若已更新,則請求服務端.
NSURLRequestReloadIgnoringLocalCacheData = 1 //忽略本地緩存數(shù)據(jù),直接請求服務端.
NSURLRequestIgnoringLocalAndRemoteCacheData = 4 //忽略本地緩存,代理服務器以及其他中介,直接請求源服務端.
NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData
NSURLRequestReturnCacheDataElseLoad = 2 //有緩存就使用,不管其有效性(即忽略Cache-Control字段), 無則請求服務端.
NSURLRequestReturnCacheDataDontLoad = 3 //只加載本地緩存. 沒有就失敗. (確定當前無網(wǎng)絡時使用)
NSURLRequestReloadRevalidatingCacheData = 5 //緩存數(shù)據(jù)必須得得到服務端確認有效才使用
3.)創(chuàng)建NSURLSession會話對象
可以通過采用iOS共享Session的方式
// 采用蘋果提供的共享session NSURLSession *sharedSession = [NSURLSession sharedSession];
可以通過NSURLSessionConfiguration方式配置不同的NSURLSession
// 構造NSURLSessionConfiguration NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; // 構造NSURLSession,網(wǎng)絡會話; NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];
通過NSURLSessionConfiguration提供了三種創(chuàng)建NSURLSession的方式
defaultSessionConfiguration //默認配置使用的是持久化的硬盤緩存,存儲證書到用戶鑰匙鏈。存儲cookie到shareCookie。
ephemeralSessionConfiguration //不使用永久持存cookie、證書、緩存的配置,最佳優(yōu)化數(shù)據(jù)傳輸。
backgroundSessionConfigurationWithIdentifier //可以上傳下載HTTP和HTTPS的后臺任務(程序在后臺運行)。
在后臺時,將網(wǎng)絡傳輸交給系統(tǒng)的單獨的一個進程,即使app掛起、推出甚至崩潰照樣在后臺執(zhí)行。
也可以通過NSURLSessionConfiguration統(tǒng)一設置超時時間、請求頭等信息
// 構造NSURLSessionConfiguration
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
//設置請求超時為10秒鐘
configuration.timeoutIntervalForRequest = 10;
//在蜂窩網(wǎng)絡情況下是否繼續(xù)請求(上傳或下載)
configuration.allowsCellularAccess = NO;
//配置請求頭
configuration.HTTPAdditionalHeaders =@{@"Content-Encoding":@"gzip"};4.) 創(chuàng)建NSURLSessionTask對象,然后執(zhí)行
// 構造NSURLSessionTask,會話任務;
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
// 請求失敗,打印錯誤信息
if (error) {
NSLog(@"get error :%@",error.localizedDescription);
}
//請求成功,解析數(shù)據(jù)
else {
// JSON數(shù)據(jù)格式解析
id object = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];
// 判斷是否解析成功
if (error) {
NSLog(@"get error :%@",error.localizedDescription);
}else {
NSLog(@"get success :%@",object);
// 解析成功,處理數(shù)據(jù),通過GCD獲取主隊列,在主線程中刷新界面。
dispatch_async(dispatch_get_main_queue(), ^{
// 刷新界面....
});
}
}
}];iOS為了適應不同的應用場景提供了不同類型的NSSessionTask
NSURLSessionDataTask //一般的get、post等請求
NSURLSessionUploadTask // 用于上傳文件或者數(shù)據(jù)量比較大的請求
NSURLSessionDownloadTask //用于下載文件或者數(shù)據(jù)量比較大的請求
NSURLSessionStreamTask //建立一個TCP / IP連接的主機名和端口或一個網(wǎng)絡服務對象。
task的三個函數(shù)
- (void)suspend;//暫停
- (void)resume;//開始或者恢復
- (void)cancel;//關閉任務
NSURLSession其他請求示例
1.)post請求
// 1、創(chuàng)建URL資源地址
NSURL *url = [NSURL URLWithString:@"http://api.nohttp.net/postBody"];
// 2、創(chuàng)建Reuest請求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 3、配置Request
// 設置請求超時
[request setTimeoutInterval:10.0];
// 設置請求方法
[request setHTTPMethod:@"POST"];
// 設置頭部參數(shù)
[request addValue:@"gzip" forHTTPHeaderField:@"Content-Encoding"];
// 4、構造請求參數(shù)
// 4.1、創(chuàng)建字典參數(shù),將參數(shù)放入字典中,可防止程序員在主觀意識上犯錯誤,即參數(shù)寫錯。
NSDictionary *parametersDict = @{@"name":@"yanzhenjie",@"pwd":@"123"};
// 4.2、遍歷字典,以“key=value&”的方式創(chuàng)建參數(shù)字符串。
NSMutableString *parameterString = [[NSMutableString alloc]init];
int pos =0;
for (NSString *key in parametersDict.allKeys) {
// 拼接字符串
[parameterString appendFormat:@"%@=%@", key, parametersDict[key]];
if(pos<parametersDict.allKeys.count-1){
[parameterString appendString:@"&"];
}
pos++;
}
// 4.3、NSString轉(zhuǎn)成NSData數(shù)據(jù)類型。
NSData *parametersData = [parameterString dataUsingEncoding:NSUTF8StringEncoding];
// 5、設置請求報文
[request setHTTPBody:parametersData];
// 6、構造NSURLSessionConfiguration
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
// 7、創(chuàng)建網(wǎng)絡會話
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];
// 8、創(chuàng)建會話任務
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
// 10、判斷是否請求成功
if (error) {
NSLog(@"post error :%@",error.localizedDescription);
}else {
// 如果請求成功,則解析數(shù)據(jù)。
id object = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];
// 11、判斷是否解析成功
if (error) {
NSLog(@"post error :%@",error.localizedDescription);
}else {
// 解析成功,處理數(shù)據(jù),通過GCD獲取主隊列,在主線程中刷新界面。
NSLog(@"post success :%@",object);
dispatch_async(dispatch_get_main_queue(), ^{
// 刷新界面...
});
}
}
}];
// 9、執(zhí)行任務
[task resume];2.)附帶表單參數(shù)文件上傳
NSDate* dat = [NSDate dateWithTimeIntervalSinceNow:0];
NSTimeInterval a=[dat timeIntervalSince1970];
NSString* fileName = [NSString stringWithFormat:@"file_%0.f.txt", a];
[FileUtils writeDataToFile:fileName data:[@"upload_file_to_server" dataUsingEncoding:NSUTF8StringEncoding]];
// 以流的方式上傳,大小理論上不受限制,但應注意時間
// 1、創(chuàng)建URL資源地址
NSURL *url = [NSURL URLWithString:@"http://api.nohttp.net/upload"];
// 2、創(chuàng)建Reuest請求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 3、配置Request
//設置Body值方法二,這種方法比較原始,不常用,不過可以用來上傳參數(shù)和文件
NSString *BOUNDARY = @"whoislcj";//表單分界線 可以自定義任意值
[request setValue:[@"multipart/form-data; boundary=" stringByAppendingString:BOUNDARY] forHTTPHeaderField:@"Content-Type"];
// 文件上傳使用post
[request setHTTPMethod:@"POST"];
// 設置請求超時
[request setTimeoutInterval:30.0f];
//用于存放二進制數(shù)據(jù)流
NSMutableData *body = [NSMutableData data];
//追加一個普通表單參數(shù) name=yanzhenjie
NSString *nameParam = [NSString stringWithFormat:@"--%@\r\nContent-Disposition: form-data; name=\"%@\"\r\n\r\n%@\r\n",BOUNDARY,@"name",@"yanzhenjie",nil];
[body appendData:[nameParam dataUsingEncoding:NSUTF8StringEncoding]];
//追加一個普通表單參數(shù) pwd=123
NSString *pwdParam = [NSString stringWithFormat:@"--%@\r\nContent-Disposition: form-data; name=\"%@\"\r\n\r\n%@\r\n",BOUNDARY,@"pwd",@"123",nil];
[body appendData:[pwdParam dataUsingEncoding:NSUTF8StringEncoding]];
//追加一個文件表單參數(shù)
// Content-Disposition: form-data; name="<服務器端需要知道的名字>"; filename="<服務器端這個傳上來的文件名>"
// Content-Type: application/octet-stream --根據(jù)不同的文件類型選擇不同的值
NSString *file = [NSString stringWithFormat:@"--%@\r\nContent-Disposition: form-data; name=\"%@\";filename=\"%@\"\r\nContent-Type: application/octet-stream\r\n\r\n",BOUNDARY,@"headUrl",fileName,nil];
[body appendData:[file dataUsingEncoding:NSUTF8StringEncoding]];
//獲取file路徑
NSString *filePath =[FileUtils getFilePath:fileName];
NSData *data =[NSData dataWithContentsOfFile:filePath];
//追加文件二進制數(shù)據(jù)
[body appendData:data];
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
//結束分割線
NSString *endString = [NSString stringWithFormat:@"--%@--",BOUNDARY];
[body appendData:[endString dataUsingEncoding:NSUTF8StringEncoding]];
// 創(chuàng)建會話
NSURLSession *session = [NSURLSession sharedSession];
// 3.開始上傳 request的body data將被忽略,而由fromData提供
NSURLSessionUploadTask *uploadTask= [session uploadTaskWithRequest:request fromData:body completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error) {
NSLog(@"upload error:%@",error);
} else {
NSLog(@"upload success:%@", [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error]);
dispatch_async(dispatch_get_main_queue(), ^{
// 刷新界面...
});
}
}];
//執(zhí)行任務
[uploadTask resume];3.)文件下載
// 創(chuàng)建url
NSString *urlStr =@"https://cache.yisu.com/upload/information/20200623/126/122340.png";
NSURL *Url = [NSURL URLWithString:urlStr];
// 創(chuàng)建請求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:Url];
// 設置請求超時
[request setTimeoutInterval:30.0];
// 創(chuàng)建會話
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDownloadTask *downLoadTask = [session downloadTaskWithRequest:request completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (!error) {
NSLog(@"download sucess : %@", location);
NSData *data=[NSData dataWithContentsOfURL:location];
UIImage *image=[UIImage imageWithData:data];
dispatch_async(dispatch_get_main_queue(), ^{
// 刷新界面...
UIImageView *imageView =[[UIImageView alloc]init];
imageView.image=image;
[self.view addSubview:imageView];
[imageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self.view);
make.size.mas_equalTo(CGSizeMake(300, 300));
}];
});
} else {
NSLog(@"download error : %@", error.localizedDescription);
}
}];
//啟動任務
[downLoadTask resume];感謝你能夠認真閱讀完這篇文章,希望小編分享的“IOS網(wǎng)絡請求之NSURLSession使用的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián)建站,關注創(chuàng)新互聯(lián)網(wǎng)站建設公司行業(yè)資訊頻道,更多相關知識等著你來學習!
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)建站www.chinadenli.net,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
本文題目:IOS網(wǎng)絡請求之NSURLSession使用的示例分析-創(chuàng)新互聯(lián)
當前URL:http://www.chinadenli.net/article24/ipcje.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供用戶體驗、品牌網(wǎng)站建設、品牌網(wǎng)站設計、移動網(wǎng)站建設、App設計、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容