這篇文章主要介紹了IOS網(wǎng)絡(luò)請(qǐng)求之NSURLSession使用的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
創(chuàng)新互聯(lián)公司擁有十載成都網(wǎng)站建設(shè)工作經(jīng)驗(yàn),為各大企業(yè)提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作服務(wù),對(duì)于網(wǎng)頁(yè)設(shè)計(jì)、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、成都App定制開(kāi)發(fā)、wap網(wǎng)站建設(shè)(手機(jī)版網(wǎng)站建設(shè))、程序開(kāi)發(fā)、網(wǎng)站優(yōu)化(SEO優(yōu)化)、微網(wǎng)站、域名注冊(cè)等,憑借多年來(lái)在互聯(lián)網(wǎng)的打拼,我們?cè)诨ヂ?lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了很多網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、網(wǎng)絡(luò)營(yíng)銷(xiāo)經(jīng)驗(yàn),集策劃、開(kāi)發(fā)、設(shè)計(jì)、營(yíng)銷(xiāo)、管理等網(wǎng)站化運(yùn)作于一體,具備承接各種規(guī)模類(lèi)型的網(wǎng)站建設(shè)項(xiàng)目的能力。
前言:
無(wú)論是Android還是ios都離不開(kāi)與服務(wù)器交互,這就必須用到網(wǎng)絡(luò)請(qǐng)求,記得在2013年做iOS的時(shí)候那時(shí)候用的ASIHTTPRequest框架,現(xiàn)在重新?lián)炱餴OS的時(shí)候ASIHTTPRequest已經(jīng)停止維護(hù),大家都在用AFNetWorking作為首選網(wǎng)絡(luò)請(qǐng)求框架,之前的ASIHTTPRequest是基于NSURLConnection類(lèi)實(shí)現(xiàn)的,早期的AFNetWorking也是基于NSURLConnection實(shí)現(xiàn),后來(lái)iOS9 之后已經(jīng)放棄了NSURLConnection,開(kāi)始使用iOS 7之后推出的NSURLSession,本著追根溯源的原則,首先學(xué)習(xí)一下NSURLSession的實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求,然后再去學(xué)習(xí)AFNetWorking。
了解NSURLSession
NSURLSession是2013年iOS 7發(fā)布的用于替代NSURLConnection的,iOS 9之后NSURLConnection徹底推出歷史舞臺(tái)。其使用起來(lái)非常方便,今天使用NSURLConnection分別實(shí)現(xiàn)了get、post、表單提交、文件上傳、文件下載,讓我這個(gè)以Android開(kāi)發(fā)為主的屌絲程序員贊嘆不已,根據(jù)NSURLSession會(huì)話對(duì)象創(chuàng)建一個(gè)請(qǐng)求Task,然后執(zhí)行該Task即可,包括緩存、會(huì)話周期,多線程任務(wù)iOS都已經(jīng)在sdk層面封裝完畢,不過(guò)比較遺憾的時(shí)NSURLSession只提供了異步請(qǐng)求方式而沒(méi)有提供同步請(qǐng)求方式。接下來(lái)我們來(lái)如何實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求。
NSURLSession使用
我們首先以一個(gè)簡(jiǎn)單的get請(qǐng)求為例開(kāi)始。
1.)首先構(gòu)造一個(gè)NSURL請(qǐng)求資源地址
// 構(gòu)造URL資源地址 NSURL *url = [NSURL URLWithString:@http://api.nohttp.net/method?name=yanzhenjie&pwd=123];
2.)創(chuàng)建一個(gè)NSRequest請(qǐng)求對(duì)象
// 創(chuàng)建Request請(qǐng)求 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; // 配置Request請(qǐng)求 // 設(shè)置請(qǐng)求方法 [request setHTTPMethod:@"GET"]; // 設(shè)置請(qǐng)求超時(shí) 默認(rèn)超時(shí)時(shí)間60s [request setTimeoutInterval:10.0]; // 設(shè)置頭部參數(shù) [request addValue:@"gzip" forHTTPHeaderField:@"Content-Encoding"]; //或者下面這種方式 添加所有請(qǐng)求頭信息 request.allHTTPHeaderFields=@{@"Content-Encoding":@"gzip"}; //設(shè)置緩存策略 [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
根據(jù)需求添加不用的設(shè)置,比如請(qǐng)求方式、超時(shí)時(shí)間、請(qǐng)求頭信息,這里重點(diǎn)介紹下緩存策略:
NSURLRequestUseProtocolCachePolicy = 0 //默認(rèn)的緩存策略, 如果緩存不存在,直接從服務(wù)端獲取。如果緩存存在,會(huì)根據(jù)response中的Cache-Control字段判斷下一步操作,如: Cache-Control字段為must-revalidata, 則詢(xún)問(wèn)服務(wù)端該數(shù)據(jù)是否有更新,無(wú)更新的話直接返回給用戶(hù)緩存數(shù)據(jù),若已更新,則請(qǐng)求服務(wù)端.
NSURLRequestReloadIgnoringLocalCacheData = 1 //忽略本地緩存數(shù)據(jù),直接請(qǐng)求服務(wù)端.
NSURLRequestIgnoringLocalAndRemoteCacheData = 4 //忽略本地緩存,代理服務(wù)器以及其他中介,直接請(qǐng)求源服務(wù)端.
NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData
NSURLRequestReturnCacheDataElseLoad = 2 //有緩存就使用,不管其有效性(即忽略Cache-Control字段), 無(wú)則請(qǐng)求服務(wù)端.
NSURLRequestReturnCacheDataDontLoad = 3 //只加載本地緩存. 沒(méi)有就失敗. (確定當(dāng)前無(wú)網(wǎng)絡(luò)時(shí)使用)
NSURLRequestReloadRevalidatingCacheData = 5 //緩存數(shù)據(jù)必須得得到服務(wù)端確認(rèn)有效才使用
3.)創(chuàng)建NSURLSession會(huì)話對(duì)象
可以通過(guò)采用iOS共享Session的方式
// 采用蘋(píng)果提供的共享session NSURLSession *sharedSession = [NSURLSession sharedSession];
可以通過(guò)NSURLSessionConfiguration方式配置不同的NSURLSession
// 構(gòu)造NSURLSessionConfiguration NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; // 構(gòu)造NSURLSession,網(wǎng)絡(luò)會(huì)話; NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];
通過(guò)NSURLSessionConfiguration提供了三種創(chuàng)建NSURLSession的方式
defaultSessionConfiguration //默認(rèn)配置使用的是持久化的硬盤(pán)緩存,存儲(chǔ)證書(shū)到用戶(hù)鑰匙鏈。存儲(chǔ)cookie到shareCookie。
ephemeralSessionConfiguration //不使用永久持存cookie、證書(shū)、緩存的配置,最佳優(yōu)化數(shù)據(jù)傳輸。
backgroundSessionConfigurationWithIdentifier //可以上傳下載HTTP和HTTPS的后臺(tái)任務(wù)(程序在后臺(tái)運(yùn)行)。
在后臺(tái)時(shí),將網(wǎng)絡(luò)傳輸交給系統(tǒng)的單獨(dú)的一個(gè)進(jìn)程,即使app掛起、推出甚至崩潰照樣在后臺(tái)執(zhí)行。
也可以通過(guò)NSURLSessionConfiguration統(tǒng)一設(shè)置超時(shí)時(shí)間、請(qǐng)求頭等信息
// 構(gòu)造NSURLSessionConfiguration NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; //設(shè)置請(qǐng)求超時(shí)為10秒鐘 configuration.timeoutIntervalForRequest = 10; //在蜂窩網(wǎng)絡(luò)情況下是否繼續(xù)請(qǐng)求(上傳或下載) configuration.allowsCellularAccess = NO; //配置請(qǐng)求頭 configuration.HTTPAdditionalHeaders =@{@"Content-Encoding":@"gzip"};
4.) 創(chuàng)建NSURLSessionTask對(duì)象,然后執(zhí)行
// 構(gòu)造NSURLSessionTask,會(huì)話任務(wù); NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { // 請(qǐng)求失敗,打印錯(cuò)誤信息 if (error) { NSLog(@"get error :%@",error.localizedDescription); } //請(qǐng)求成功,解析數(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ù),通過(guò)GCD獲取主隊(duì)列,在主線程中刷新界面。 dispatch_async(dispatch_get_main_queue(), ^{ // 刷新界面.... }); } } }];
iOS為了適應(yīng)不同的應(yīng)用場(chǎng)景提供了不同類(lèi)型的NSSessionTask
NSURLSessionDataTask //一般的get、post等請(qǐng)求
NSURLSessionUploadTask // 用于上傳文件或者數(shù)據(jù)量比較大的請(qǐng)求
NSURLSessionDownloadTask //用于下載文件或者數(shù)據(jù)量比較大的請(qǐng)求
NSURLSessionStreamTask //建立一個(gè)TCP / IP連接的主機(jī)名和端口或一個(gè)網(wǎng)絡(luò)服務(wù)對(duì)象。
task的三個(gè)函數(shù)
- (void)suspend;//暫停
- (void)resume;//開(kāi)始或者恢復(fù)
- (void)cancel;//關(guān)閉任務(wù)
NSURLSession其他請(qǐng)求示例
1.)post請(qǐng)求
// 1、創(chuàng)建URL資源地址 NSURL *url = [NSURL URLWithString:@"http://api.nohttp.net/postBody"]; // 2、創(chuàng)建Reuest請(qǐng)求 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; // 3、配置Request // 設(shè)置請(qǐng)求超時(shí) [request setTimeoutInterval:10.0]; // 設(shè)置請(qǐng)求方法 [request setHTTPMethod:@"POST"]; // 設(shè)置頭部參數(shù) [request addValue:@"gzip" forHTTPHeaderField:@"Content-Encoding"]; // 4、構(gòu)造請(qǐng)求參數(shù) // 4.1、創(chuàng)建字典參數(shù),將參數(shù)放入字典中,可防止程序員在主觀意識(shí)上犯錯(cuò)誤,即參數(shù)寫(xiě)錯(cuò)。 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(pos2.)附帶表單參數(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]]; // 以流的方式上傳,大小理論上不受限制,但應(yīng)注意時(shí)間 // 1、創(chuàng)建URL資源地址 NSURL *url = [NSURL URLWithString:@"http://api.nohttp.net/upload"]; // 2、創(chuàng)建Reuest請(qǐng)求 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; // 3、配置Request //設(shè)置Body值方法二,這種方法比較原始,不常用,不過(guò)可以用來(lái)上傳參數(shù)和文件 NSString *BOUNDARY = @"whoislcj";//表單分界線 可以自定義任意值 [request setValue:[@"multipart/form-data; boundary=" stringByAppendingString:BOUNDARY] forHTTPHeaderField:@"Content-Type"]; // 文件上傳使用post [request setHTTPMethod:@"POST"]; // 設(shè)置請(qǐng)求超時(shí) [request setTimeoutInterval:30.0f]; //用于存放二進(jìn)制數(shù)據(jù)流 NSMutableData *body = [NSMutableData data]; //追加一個(gè)普通表單參數(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]]; //追加一個(gè)普通表單參數(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]]; //追加一個(gè)文件表單參數(shù) // Content-Disposition: form-data; name="<服務(wù)器端需要知道的名字>"; filename="<服務(wù)器端這個(gè)傳上來(lái)的文件名>" // Content-Type: application/octet-stream --根據(jù)不同的文件類(lèi)型選擇不同的值 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]; //追加文件二進(jìn)制數(shù)據(jù) [body appendData:data]; [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; //結(jié)束分割線 NSString *endString = [NSString stringWithFormat:@"--%@--",BOUNDARY]; [body appendData:[endString dataUsingEncoding:NSUTF8StringEncoding]]; // 創(chuàng)建會(huì)話 NSURLSession *session = [NSURLSession sharedSession]; // 3.開(kāi)始上傳 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í)行任務(wù) [uploadTask resume];3.)文件下載
// 創(chuàng)建url NSString *urlStr =@"/upload/otherpic51/122340.png"; NSURL *Url = [NSURL URLWithString:urlStr]; // 創(chuàng)建請(qǐng)求 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:Url]; // 設(shè)置請(qǐng)求超時(shí) [request setTimeoutInterval:30.0]; // 創(chuàng)建會(huì)話 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); } }]; //啟動(dòng)任務(wù) [downLoadTask resume];感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“IOS網(wǎng)絡(luò)請(qǐng)求之NSURLSession使用的示例分析”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
網(wǎng)站題目:IOS網(wǎng)絡(luò)請(qǐng)求之NSURLSession使用的示例分析
網(wǎng)站URL:http://weahome.cn/article/gcsccd.html