NSURLSession類

NSURLSession

  1. 在2013年, 蘋(píng)果解開(kāi)了NSURLSession的面紗, 作為NSURLConnection的繼承者, 比較NSURLConnection, NSURLSession提供了配置會(huì)話緩存,協(xié)議,cookie和證書(shū)的能力, 這使得網(wǎng)絡(luò)架構(gòu)和應(yīng)用程序可以獨(dú)立工作, 互不干擾, 另外, NSURLSession另一個(gè)重要的部分是會(huì)話任務(wù), 它負(fù)責(zé)加載數(shù)據(jù), 在客戶端和服務(wù)器端進(jìn)行文件的上傳下載.

  2. NSURLSession

    • NSURLConnection主要任務(wù):
      • 獲取數(shù)據(jù)(JSON, XML),
      • 文件上傳.
      • 文件下載.
    • NSURLSession中, 三個(gè)人物分別由以下的抽象類來(lái)完成.
      • NSURLSessionData
      • NSURLSessionUploadTask,
      • NSURLSessionDownloadTask,
        這三個(gè)類都是 NSURLSessionTask這個(gè)抽象類的子類, 相比直接使用NSURLConnection, NSURLSessionTask支持任務(wù)的暫停、取消和恢復(fù)瘩燥,并且默認(rèn)任務(wù)運(yùn)行在其他非主線程中.
  3. 數(shù)據(jù)請(qǐng)求

    NSURLSessionDataTask實(shí)現(xiàn)流程與NSURLConnection的靜態(tài)方法類似, 代碼如下:
     -(void)loadJsonData{
     
     1.創(chuàng)建url
     NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.208/ViewStatus.aspx?userName=%@&password=%@",@"KenshinCui",@"123"];
     urlStr =[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
     NSURL *url=[NSURL URLWithString:urlStr];
     
     2.創(chuàng)建請(qǐng)求
     NSURLRequest *request=[NSURLRequest requestWithURL:url];
    
     3.創(chuàng)建會(huì)話(這里使用了一個(gè)全局會(huì)話)并且啟動(dòng)任務(wù)
     NSURLSession *session=[NSURLSession sharedSession];
     // 從會(huì)話創(chuàng)建任務(wù)
     NSURLSessionDataTask *dataTask=[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
     if (!error) {
         NSString *dataStr=[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
         NSLog(@"%@",dataStr);
     }else{
         NSLog(@"error is :%@",error.localizedDescription);
     }
     }]; 
     [dataTask resume];//恢復(fù)線程子檀,啟動(dòng)任務(wù)
     }
    
  4. 如何使用NSURLSessionUploadTask實(shí)現(xiàn)文件上傳, 這里有幾個(gè)方法

    #pragma mark 取得mime types
    -(NSString *)getMIMETypes:(NSString *)fileName{
    return @"image/jpg";
    }
    #pragma mark 取得數(shù)據(jù)體
    -(NSData *)getHttpBody:(NSString *)fileName{
    
    NSString *boundary=@"KenshinCui";
    
    NSMutableData *dataM=[NSMutableData data];
    
    NSString *strTop=[NSString stringWithFormat:@"--%@\nContent- Disposition: form-data; name=\"file1\"; filename=\"%@\"\nContent-Type: %@\n\n",boundary,fileName,[self getMIMETypes:fileName]];
       
    NSString *strBottom=[NSString stringWithFormat:@"\n--%@--",boundary];
    
    NSString *filePath=[[NSBundle mainBundle] pathForResource:fileName ofType:nil];
    
    NSData *fileData=[NSData dataWithContentsOfFile:filePath];
    
    [dataM appendData:[strTop dataUsingEncoding:NSUTF8StringEncoding]];
    
    [dataM appendData:fileData];
     [dataM appendData:[strBottom dataUsingEncoding:NSUTF8StringEncoding]];
     return dataM;
     }
    
    #pragma mark 上傳文件
    -(void)uploadFile{
    NSString *fileName=@"pic.jpg";
    
    //1.創(chuàng)建url
    NSString *urlStr=@"http://192.168.1.208/FileUpload.aspx";
    
    urlStr =[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    
    NSURL *url=[NSURL URLWithString:urlStr];
    //2.創(chuàng)建請(qǐng)求
    
    NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];
    
    request.HTTPMethod=@"POST";
    
    //3.構(gòu)建數(shù)據(jù)
     NSString *path=[[NSBundle mainBundle] pathForResource:fileName ofType:nil];
    NSData *data=[self getHttpBody:fileName];
    request.HTTPBody=data;
    
    [request setValue:[NSString stringWithFormat:@"%lu",(unsigned long)data.length] forHTTPHeaderField:@"Content-Length"];
    [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",@"KenshinCui"] forHTTPHeaderField:@"Content-Type"];
    //4.創(chuàng)建會(huì)話
    NSURLSession *session=[NSURLSession sharedSession];
    NSURLSessionUploadTask *uploadTask=[session uploadTaskWithRequest:request fromData:data completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    if (!error) {
        NSString *dataStr=[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"%@",dataStr);
    }else{
        NSLog(@"error is :%@",error.localizedDescription);
    }
    }];
    
    [uploadTask resume];
    }
    
  5. 文件下載
    使用NSURLSessionDownloadTask下載文件的過(guò)程與前面差不多, 需要注意的是文件下載文件之后會(huì)自動(dòng)保存到一個(gè)臨時(shí)目錄. 需要開(kāi)發(fā)人員自己講文件重新放到其他指定的目錄下.

     -(void)downloadFile{
     //1.創(chuàng)建url
     NSString *fileName=@"1.jpg";
     NSString *urlStr=[NSString stringWithFormat: @"http://192.168.1.208/FileDownload.aspx?file=%@",fileName];
     urlStr =[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
     NSURL *url=[NSURL URLWithString:urlStr];
     //2.創(chuàng)建請(qǐng)求
         requestWithURL:url];
    
     //3.創(chuàng)建會(huì)話(這里使用了一個(gè)全局會(huì)話)并且啟動(dòng)任務(wù)
     NSURLSession *session=[NSURLSession sharedSession];
     NSURLSessionDownloadTask *downloadTask=[session downloadTaskWithRequest:request completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
     if (!error) {
         //注意location是下載后的臨時(shí)保存路徑,需要將它移動(dòng)到需要保存的位置
         
         NSError *saveError;
         NSString *cachePath=[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
         NSString *savePath=[cachePath stringByAppendingPathComponent:fileName];
         NSLog(@"%@",savePath);
         NSURL *saveUrl=[NSURL fileURLWithPath:savePath];
         [[NSFileManager defaultManager] copyItemAtURL:location toURL:saveUrl error:&saveError];
         if (!saveError) {
             NSLog(@"save sucess.");
         }else{
             NSLog(@"error is :%@",saveError.localizedDescription);
         }
         
     }else{
         NSLog(@"error is :%@",error.localizedDescription);
     }
     }];
    
     [downloadTask resume];
     }
    
  6. 會(huì)話,(session 翻譯成會(huì)話不太好)
    NSURLConnection通過(guò)全局狀態(tài)管理cookies, 認(rèn)證信息等公共資源, 這樣如果遇到兩個(gè)鏈接需要使用不同的資源配置情況時(shí),就無(wú)法解決了, 但是這個(gè)問(wèn)題在NSURLSession中得到了結(jié)局. NSURLSession同事對(duì)應(yīng)著多個(gè)鏈接, 會(huì)話通過(guò)工廠方法來(lái)創(chuàng)建, 同一個(gè)會(huì)話使用相同的狀態(tài)信息. NSURLSession支持進(jìn)程三種會(huì)話:

    1. defaultSessionConfiguration:進(jìn)程內(nèi)會(huì)話(默認(rèn)會(huì)話)辩越,用硬盤(pán)來(lái)緩存數(shù)據(jù)。
    2. ephemeralSessionConfiguration:臨時(shí)的進(jìn)程內(nèi)會(huì)話(內(nèi)存)埃跷,不會(huì)將cookie、緩存儲(chǔ)存到本地,只會(huì)放到內(nèi)存中典唇,當(dāng)應(yīng)用程序退出后數(shù)據(jù)也會(huì)消失。
    3. backgroundSessionConfiguration:后臺(tái)會(huì)話胯府,相比默認(rèn)會(huì)話介衔,該會(huì)話會(huì)在后臺(tái)開(kāi)啟一個(gè)線程進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)處理。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末骂因,一起剝皮案震驚了整個(gè)濱河市炎咖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寒波,老刑警劉巖乘盼,帶你破解...
    沈念sama閱讀 212,332評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異俄烁,居然都是意外死亡绸栅,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)页屠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)粹胯,“玉大人,你說(shuō)我怎么就攤上這事辰企》缇溃” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,812評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵牢贸,是天一觀的道長(zhǎng)竹观。 經(jīng)常有香客問(wèn)我,道長(zhǎng)潜索,這世上最難降的妖魔是什么臭增? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,607評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮帮辟,結(jié)果婚禮上速址,老公的妹妹穿的比我還像新娘。我一直安慰自己由驹,他們只是感情好芍锚,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,728評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布昔园。 她就那樣靜靜地躺著,像睡著了一般并炮。 火紅的嫁衣襯著肌膚如雪默刚。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,919評(píng)論 1 290
  • 那天逃魄,我揣著相機(jī)與錄音荤西,去河邊找鬼。 笑死伍俘,一個(gè)胖子當(dāng)著我的面吹牛邪锌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播癌瘾,決...
    沈念sama閱讀 39,071評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼觅丰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了妨退?” 一聲冷哼從身側(cè)響起妇萄,我...
    開(kāi)封第一講書(shū)人閱讀 37,802評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎咬荷,沒(méi)想到半個(gè)月后冠句,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,256評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡幸乒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,576評(píng)論 2 327
  • 正文 我和宋清朗相戀三年懦底,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逝变。...
    茶點(diǎn)故事閱讀 38,712評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡基茵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出壳影,到底是詐尸還是另有隱情,我是刑警寧澤弥臼,帶...
    沈念sama閱讀 34,389評(píng)論 4 332
  • 正文 年R本政府宣布宴咧,位于F島的核電站,受9級(jí)特大地震影響径缅,放射性物質(zhì)發(fā)生泄漏掺栅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,032評(píng)論 3 316
  • 文/蒙蒙 一纳猪、第九天 我趴在偏房一處隱蔽的房頂上張望氧卧。 院中可真熱鬧,春花似錦氏堤、人聲如沸沙绝。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)闪檬。三九已至星著,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間粗悯,已是汗流浹背虚循。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留样傍,地道東北人横缔。 一個(gè)月前我還...
    沈念sama閱讀 46,473評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像衫哥,于是被迫代替她去往敵國(guó)和親剪廉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,606評(píng)論 2 350

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