核心類
- NSURLSession
- NSURLSessionConfiguration
- NSURLSessionTask
- NSURLSessionDataTask
- 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
編碼思路
- 正常實(shí)現(xiàn)data任務(wù)的下載.
- data任務(wù)轉(zhuǎn)成download任務(wù), 完成下載.
- 取消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);
}