NSURLSessionDataDelegate的代理方法使用總結(jié)

核心類

  • NSURLSession
  • NSURLSessionConfiguration
  • NSURLSessionTask
    1. NSURLSessionDataTask
    2. NSURLSessionDownload

代理

  • NSURLSessionDelegate
  • NSURLSessionTaskDelegate
  • NSURLSessionDataDelegate
  • NSURLSessionDownloadDelegate

NSURLSession相關(guān)的API

/** 創(chuàng)建NSURLSession對(duì)象的類方法. */
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration delegate:(id<NSURLSessionDelegate>)delegate delegateQueue:(NSOperationQueue *)queue

/** 通過URL, 返回一個(gè)數(shù)據(jù)任務(wù). */
- (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url

/** 通過request請(qǐng)求, 返回一個(gè)數(shù)據(jù)任務(wù). */
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request

NSURLSessionDataDelegate

/**  告訴delegate已經(jīng)接受到服務(wù)器的初始應(yīng)答, 準(zhǔn)備接下來的數(shù)據(jù)任務(wù)的操作. */
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler

/** 告訴delegate已經(jīng)接收到部分?jǐn)?shù)據(jù). */
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data


/** 告訴delegate, data task 已經(jīng)轉(zhuǎn)變成download task. */
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask

NSURLSessionTaskDelegate

/** 告訴delegate, task已經(jīng)完成. */
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error

NSURLSessionDownloadDelegate

/** 告訴delegate, download task已經(jīng)完成. */
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location

編碼思路

  1. 正常實(shí)現(xiàn)data任務(wù)的下載.
  2. data任務(wù)轉(zhuǎn)成download任務(wù), 完成下載.
  3. 取消data任務(wù)下載.

創(chuàng)建繪話和任務(wù)

- (void)handleData /*-> 自己定義的一個(gè)方法. */
{

     /** 1. 創(chuàng)建NSURLSessionConfiguration類的對(duì)象, 這個(gè)對(duì)象被用于創(chuàng)建NSURLSession類的對(duì)象. */     
     NSURLSessionConfiguration *configura = [NSURLSessionConfiguration defaultSessionConfiguration];

    /**
     * 2. 創(chuàng)建NSURLSession的對(duì)象.
     * 參數(shù)一 : NSURLSessionConfiguration類的對(duì)象.(第1步創(chuàng)建的對(duì)象.)
     * 參數(shù)二 : session的代理人. 如果為nil, 系統(tǒng)將會(huì)提供一個(gè)代理人.
     * 參數(shù)三 : 一個(gè)隊(duì)列, 代理方法在這個(gè)隊(duì)列中執(zhí)行. 如果為nil, 系統(tǒng)會(huì)自動(dòng)創(chuàng)建一系列的隊(duì)列.
     * 注: 只能通過這個(gè)方法給session設(shè)置代理人, 因?yàn)樵贜SURLSession中delegate屬性是只讀的.
     */

    NSURLSession *session = [NSURLSession sessionWithConfiguration:configura delegate:self delegateQueue:nil];

    /** 3. 創(chuàng)建URL. */
    NSURL *url = [NSURL URLWithString:@"http://c.3g.163.com/photo/api/list/0096/4GJ60096.json"];
    /** 4. 創(chuàng)建request. */
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    /** request請(qǐng)求方式為: GET. 如果是POST, 還需要設(shè)置HTTPBody屬性. */


    /** 5. 創(chuàng)建數(shù)據(jù)類型的任務(wù). */
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request];

    /** 6. 開始任務(wù). */
    [dataTask resume];

    /** 7. 在session中的所有任務(wù)都完成之后, 使session失效. */
   [session finishTasksAndInvalidate];

}

實(shí)現(xiàn)代理監(jiān)聽

接收到返回信息時(shí)(還未開始下載), 執(zhí)行的代理方法.

/** 
 * NSURLSessionDataDelegate方法實(shí)現(xiàn). 
 * completionHandler block塊內(nèi)的參數(shù) disposition 是一個(gè)枚舉值:
 * 
 * typedef NS_ENUM (NSInteger,NSURLSessionResponseDisposition ) {
   NSURLSessionResponseCancel = 0, /**-> 取消任務(wù). */
   NSURLSessionResponseAllow = 1,  /**-> 任務(wù)正常進(jìn)行. */ 
   NSURLSessionResponseBecomeDownload = 2 /**-> 從data task 轉(zhuǎn)換成 download task, 并調(diào)用 
 - URLSession:dataTask:didReceiveResponse:completionHandler: 代理方法. */
}; 
 */
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler
{

    /** a. 初始化allData屬性(步驟1中設(shè)置的屬性). */
    self.allData = [NSMutableData data];

    /** b. 讓任務(wù)繼續(xù)正常進(jìn)行.(如果沒有寫這行代碼, 將不會(huì)執(zhí)行下面的代理方法.) */
    completionHandler(NSURLSessionResponseAllow);

}

接收返回的數(shù)據(jù)


/** NSURLSessionDataDelegate方法實(shí)現(xiàn). */

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
    /** 接收返回的數(shù)據(jù). */
    [self.allData appendData:data];
}

任務(wù)完成之后調(diào)用

/** 
 * NSURLSessionTaskDelegate方法實(shí)現(xiàn).
 * 任務(wù)完成加載數(shù)據(jù)之后調(diào)用的代理方法.
 */
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
    /** 處理數(shù)據(jù). */
    NSError *er = nil;
    id result = [NSJSONSerialization JSONObjectWithData:self.allData options:NSJSONReadingMutableContainers error:&er];
    NSLog(@"result: %@", result);
}

data任務(wù)轉(zhuǎn)成download任務(wù), 完成下載.

當(dāng)轉(zhuǎn)換成download task時(shí), 會(huì)下載資源數(shù)據(jù)到磁盤文件上, 我們不需要自己接收數(shù)據(jù)了.我們還需要簽訂NSURLSessionDownloadDelegate.

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
    /** 把data task 轉(zhuǎn)換成 download task. */
  completionHandler(NSURLSessionResponseBecomeDownload);
}

**注意:當(dāng)data task 轉(zhuǎn)換成 download task 時(shí), 我們必須調(diào)用NSURLSessionDataDelegate中的
-URLSession:dataTask:didBecomeDownloadTask: 方法. **

因?yàn)橐呀?jīng)轉(zhuǎn)換成download task, 所以接下來將調(diào)用NSURLSessionDownloadDelegate的方法

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask
{
    /** 此方法內(nèi)可以不寫任何代碼, 但必須被調(diào)用. 否則將不會(huì)執(zhí)行下面的代理方法. */
}
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
{

            /** 從提供的URL中讀取數(shù)據(jù). */
        NSData *data = [NSData dataWithContentsOfURL:location];
        /** 處理數(shù)據(jù). */
        NSError *er = nil;
        id result = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&er];
        NSLog(@"result: %@", result);


}

取消data任務(wù)下載.

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{

     /** 取消data task 的下載. 之后將不會(huì)執(zhí)行任何的代理方法了. */
    completionHandler(NSURLSessionResponseCancel);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末迁酸,一起剝皮案震驚了整個(gè)濱河市专甩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌性昭,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件县遣,死亡現(xiàn)場(chǎng)離奇詭異糜颠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)萧求,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門其兴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人夸政,你說我怎么就攤上這事忌警。” “怎么了秒梳?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵法绵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我酪碘,道長(zhǎng)朋譬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任兴垦,我火速辦了婚禮徙赢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘探越。我一直安慰自己狡赐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布钦幔。 她就那樣靜靜地躺著枕屉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鲤氢。 梳的紋絲不亂的頭發(fā)上搀擂,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天西潘,我揣著相機(jī)與錄音,去河邊找鬼哨颂。 笑死喷市,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的威恼。 我是一名探鬼主播品姓,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼箫措!你這毒婦竟也來了缭黔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤蒂破,失蹤者是張志新(化名)和其女友劉穎馏谨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體附迷,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惧互,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了喇伯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喊儡。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖稻据,靈堂內(nèi)的尸體忽然破棺而出艾猜,到底是詐尸還是另有隱情,我是刑警寧澤捻悯,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布匆赃,位于F島的核電站,受9級(jí)特大地震影響今缚,放射性物質(zhì)發(fā)生泄漏算柳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蛮拔,春花似錦、人聲如沸次泽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至妥衣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背称鳞。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工涮较, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留稠鼻,地道東北人冈止。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像候齿,于是被迫代替她去往敵國(guó)和親熙暴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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