iOS-網(wǎng)絡(luò)編程(網(wǎng)絡(luò)請(qǐng)求組件)

1 NSURLConnection網(wǎng)絡(luò)組件(iOS7之前的)

CFNetWork 是一種低層的高性能架構(gòu),它是基于BSD sockets的基礎(chǔ)上做了拓展,是全部網(wǎng)絡(luò)請(qǐng)求組件的父類

NSURLConnection網(wǎng)絡(luò)組件結(jié)構(gòu)圖

2 NSURLSession網(wǎng)絡(luò)組件

iOS7之后,蘋果推出NSURLConnection 的繼任者:NSURLSession

NSURLSession網(wǎng)絡(luò)組件結(jié)構(gòu)圖

NSURLSession網(wǎng)絡(luò)組件的使用流程
1.構(gòu)造NSURL實(shí)例(鏈接地址)
2.構(gòu)造NSURLRequest請(qǐng)求
3.構(gòu)造NSURLSessionConfiguration(可選)
4.構(gòu)造NSURLSession
5.構(gòu)造NSURLSessionTask
6.構(gòu)造NSURLSession發(fā)送請(qǐng)求

客戶端通過NSURLSession與服務(wù)器對(duì)話
  • 發(fā)送網(wǎng)絡(luò)的基本流程實(shí)例代碼:
    //1.????創(chuàng)建URL
    URLNSURL *URL = [NSURL URLWithString:@"http://example.com"];
    //2.創(chuàng)建request請(qǐng)求對(duì)象
    ????request????????NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    //3.創(chuàng)建URLSession對(duì)象
    ????URLSession????NSURLSession *session = [NSURLSession sharedSession];
    //4.????????????????????????設(shè)置數(shù)據(jù)返回回調(diào)的block
    ??NSURLSessionDataTask *task = [session dataTaskWithRequest:request
    completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error) {
    //data是服務(wù)器返回的數(shù)據(jù)
    } ];
    //5.發(fā)送請(qǐng)求
    [task resume];

  • NSURLRequest

1 NSURLRequest 用于存儲(chǔ)客戶端發(fā)送給服務(wù)器的數(shù)據(jù)包信息和請(qǐng)求設(shè)置
2 NSURLRequest 只有很少的基本設(shè)置選項(xiàng),我大部分使用其子類:NSMutableURLRequest

  • NSURLRequest示例代碼:

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];

    [request setURL:url];
    // 設(shè)置請(qǐng)求方式
    [request setHTTPMethod:@"POST"];
    //設(shè)置超時(shí)時(shí)間
    [request setTimeoutInterval:60];
    //設(shè)置請(qǐng)求體數(shù)據(jù)
    [request setHTTPBody:_data];
    //設(shè)置請(qǐng)求頭
    [request setValue:@“wxhl-ios" forHTTPHeaderField:@“cookes”];
    //設(shè)置緩存策略
    [request setCachePolicy:NSURLRequestReturnCacheDataElseLoad];

  • NSResponse

1 NSURLResponse用于存儲(chǔ)服務(wù)器返回的響應(yīng)包數(shù)據(jù)
2 如果發(fā)送的是HTTP請(qǐng)求,那么使用其子類:NSHTTPURLResponse

NSResponse示例代碼:

NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
//響應(yīng)的狀態(tài)碼
????????????NSInteger statusCode = httpResponse.statusCode;
//??????????響應(yīng)頭信息
NSDictionary *allHeaderFields = httpResponse.allHeaderFields;
//取得響應(yīng)頭中的信息項(xiàng)
????????????????????NSString *contentType = [allHeaderFields objectForKey:@“Content-Type"];
  • NSURLSession

1 NSURLSession 指的是一個(gè)網(wǎng)絡(luò)會(huì)話(Session),一個(gè)網(wǎng)絡(luò)會(huì)話可以發(fā)起多個(gè)任務(wù)(Task)
2 一個(gè)任務(wù)(Task)對(duì)應(yīng)了一次網(wǎng)絡(luò)請(qǐng)求
3 Session的類型:

  • 默認(rèn)類型的Session:使用持久化的,基于磁盤的緩存

  • 臨時(shí)的Session:不在磁盤存儲(chǔ)任何數(shù)據(jù),所有的緩存都存儲(chǔ)在內(nèi)存中

  • 后臺(tái)Session:和默認(rèn)類型的Session很像,不同的是有一個(gè)獨(dú)立的進(jìn)程處理所有網(wǎng)絡(luò)請(qǐng)求

  • NSURLSessionConfiguration

1 +defaultSessionConfiguration 用于創(chuàng)建默認(rèn)類型的Session對(duì)象
2 +ephemeralSessionConfiguration 用于創(chuàng)建臨時(shí)類型的Session對(duì)象
3 +backgroundSessionConfiguration:(NSString *)identifier 用于創(chuàng)建后臺(tái)Session對(duì)象
4 NSURLSessionConfiguration 封裝了很多配置屬性,熟練配置這些屬性,可以讓網(wǎng)絡(luò)請(qǐng)求充分利用其網(wǎng)絡(luò)環(huán)境
requestCachePolicy :緩存策略
networkServiceType:網(wǎng)絡(luò)服務(wù)類型:網(wǎng)絡(luò)流量,網(wǎng)絡(luò)電話,語音,視頻
timeoutIntervalForRequest: 超時(shí)時(shí)間
HTTPAdditionalHeaders: 請(qǐng)求頭
discretionary: 用于后臺(tái)請(qǐng)求,會(huì)把WiFi和電量考慮在內(nèi).
allowsCellularAccess : 是否允許使用蜂窩數(shù)據(jù)

  • NSURLSessionConfiguration創(chuàng)建實(shí)例代碼:

      //1.創(chuàng)建session配置對(duì)象
      SessionNSURLSessionConfiguration       *sessionConfig =[NSURLSessionConfiguration defaultSessionConfiguration];
     //2.創(chuàng)建session對(duì)象
      SessionNSURLSession *session = [NSURLSession
    

sessionWithConfiguration:sessionConfig];

  • 網(wǎng)絡(luò)任務(wù)(NSURLSessionTask)
1 一個(gè)Session可以發(fā)起的多個(gè)網(wǎng)絡(luò)請(qǐng)求任務(wù)(Task)
2 三種類型的任務(wù):(Task)
 1  數(shù)據(jù)任務(wù)(NSURLSessionDataTask):

數(shù)據(jù)任務(wù)擅長處理小且頻繁的應(yīng)用程序與服務(wù)器之間的請(qǐng)求,
例如:請(qǐng)求JSON數(shù)據(jù),因?yàn)閿?shù)據(jù)任務(wù)不會(huì)將數(shù)據(jù)存儲(chǔ)到磁盤文件中,所以不支持后臺(tái)Session
2 下載任務(wù)(NSURLSessionDownLoadTask):
以文件的形式接收數(shù)據(jù),可以在程序沒有運(yùn)行時(shí)進(jìn)行后臺(tái)下載
3 上傳任務(wù)(NSURLSessionUpLoadTask):
以文件的形式發(fā)送數(shù)據(jù),可以在程序沒有運(yùn)行時(shí)進(jìn)行后臺(tái)上傳

NSURLSessionTask的關(guān)系

3.1 實(shí)例代碼:
3.11. NSURLSessionDataTask 對(duì)象的創(chuàng)建都是通過Session對(duì)象的方法創(chuàng)建,創(chuàng)建任務(wù)代碼如下:

  • 通過 block回調(diào)監(jiān)聽網(wǎng)絡(luò)加載事件
    /** 通過request對(duì)象創(chuàng)建,RequestcompletionHandler:數(shù)據(jù)加載完成回調(diào)block*/

         NSURLSessionDataTask *task =  [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {       
    

    }];

     NSURLSessionDataTask *task =  [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {       
   
}];
  • 代理對(duì)象通過協(xié)議方法監(jiān)聽網(wǎng)絡(luò)事件
    NSURLSessionConfiguration *config = [NSURLSessionConfigurationdefaultSessionConfiguration];
    //設(shè)置代理
    NSURLSession *session = [NSURLSession sessionWithConfiguration:configdelegate:self delegateQueue:mainQueue];

      //1.服務(wù)器返回響應(yīng)頭信息,注意:響應(yīng)頭中數(shù)據(jù)還沒完成
     - (void)URLSession:(NSURLSession *)session
     dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response
     completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler
    
      //2 響應(yīng)體中的數(shù)據(jù)接收完成
      - (void)URLSession:(NSURLSession *)session
     dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
    

3.1.2 上傳文件任務(wù)的創(chuàng)建:

// fileURL:上傳文件的路徑
 - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest*)requestfromFile:(NSURL *)fileURLcompletionHandler:(void (^)(NSData *data, NSURLResponse *response,NSError *error))completionHandler

// fromDatadata:上傳文件的data
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest
*)requestfromData:(NSData *)bodyDatacompletionHandler:(void (^)(NSData *data, NSURLResponse *response,NSError *error))completionHandler

上傳任務(wù)請(qǐng)求網(wǎng)絡(luò),請(qǐng)求包必須符合如下格式:

上傳文件的請(qǐng)求包必須符合的格式

3.1.3 下載任務(wù)的創(chuàng)建:

   // location
    - (NSURLSessionDownloadTask       *)downloadTaskWithRequest:(NSURLRequest*)requestcompletionHandler:(void (^)(NSURL *location, NSURLResponse*response, NSError *error))completionHandler

  - (NSURLSessionDownloadTask *)downloadTaskWithURL:(NSURL *)urlcompletionHandler:(void (^)(NSURL *location, NSURLResponse*response, NSError *error))completionHandler
  // resumeData: - (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData
  *)resumeDatacompletionHandler:(void (^)(NSURL *location, NSURLResponse*response, NSError *error))completionHandler

下載任務(wù)演示

  • 基本的下載任務(wù)
  • 下載任務(wù)的監(jiān)聽
  • 斷點(diǎn)續(xù)傳下載
  • 后臺(tái)下載
    ·在退出APP時(shí),后臺(tái)的下載任務(wù)仍然進(jìn)行中,一直到下載完成,重新進(jìn)入APP時(shí),才會(huì)觸發(fā)代理方法,拷貝文件
    ·在后臺(tái)如果沒有下載完成,重新進(jìn)入APP時(shí),下載任務(wù)會(huì)自動(dòng)繼續(xù)
    上傳文件到微博
    參考發(fā)微博步驟:
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末陋葡,一起剝皮案震驚了整個(gè)濱河市或舞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌低葫,老刑警劉巖从撼,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件州弟,死亡現(xiàn)場離奇詭異,居然都是意外死亡低零,警方通過查閱死者的電腦和手機(jī)婆翔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掏婶,“玉大人啃奴,你說我怎么就攤上這事⌒弁祝” “怎么了最蕾?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵依溯,是天一觀的道長。 經(jīng)常有香客問我瘟则,道長黎炉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任醋拧,我火速辦了婚禮慷嗜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘趁仙。我一直安慰自己洪添,他們只是感情好垦页,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布雀费。 她就那樣靜靜地躺著,像睡著了一般痊焊。 火紅的嫁衣襯著肌膚如雪盏袄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天薄啥,我揣著相機(jī)與錄音辕羽,去河邊找鬼。 笑死垄惧,一個(gè)胖子當(dāng)著我的面吹牛刁愿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播到逊,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼铣口,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了觉壶?” 一聲冷哼從身側(cè)響起脑题,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎铜靶,沒想到半個(gè)月后叔遂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡争剿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年已艰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚕苇。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡旗芬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出捆蜀,到底是詐尸還是另有隱情疮丛,我是刑警寧澤幔嫂,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站誊薄,受9級(jí)特大地震影響履恩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜呢蔫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一切心、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧片吊,春花似錦绽昏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至爷贫,卻和暖如春认然,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背漫萄。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工卷员, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人腾务。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓毕骡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親岩瘦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子未巫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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