NSURLSession 、NSURLSessionConfiguration、NSURLSessionTask

使用NSURLSession,分兩步:1、 通過NSURLSession的實例創建task  2、 執行task

NSURLSessionTask可以簡單理解爲任務:如數據請求任務,下載任務,上傳任務and so on.我們使用的是他的子類們:

NSURLSessionTask(抽象類)、NSURLSessionDataTask、NSURLSessionUploadTask、NSURLSessionDownloadTask

NSURLSessionDataTask

和數據相關的任務,dataTask完全可以勝任downloadTask和uploadTask的工作,可能也是使用最多的task種類.

簡單GET請求

// 快捷方式獲得session對象

    NSURLSession *session = [NSURLSession sharedSession];

    NSURL *url = [NSURL URLWithString:@"http://www.daka.com/login?username=daka&pwd=123"];

    // 通過URL初始化task,block內部可以直接對返回的數據進行處理

    NSURLSessionTask *task = [session dataTaskWithURL:url

                                    completionHandler:^(NSData *data, NSURLResponse *response, NSError error) {

                                        NSLog(@"%@", [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]);

                                    }];

    // 啓動任務  所有類型的task都要調用resume方法纔會開始進行請求.

    [task resume];

簡單POST請求

 NSURL *url = [NSURL URLWithString:@"http://www.daka.com/login"];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    request.HTTPMethod = @"POST";

    request.HTTPBody = [@"username=daka&pwd=123" dataUsingEncoding:NSUTF8StringEncoding];

    

    NSURLSession *session = [NSURLSession sharedSession];

    // 由於要先對request先行處理,我們通過request初始化task

    NSURLSessionTask *task = [session dataTaskWithRequest:request

                                        completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSLog(@"%@", [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]); }];

    [task resume];

NSURLSessionDataDelegate代理方法

    // 1.接收到服務器的響應

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

        // 允許處理服務器的響應,纔會繼續接收服務器返回的數據

        completionHandler(NSURLSessionResponseAllow);

    }

    

    // 2.接收到服務器的數據(可能調用多次)

    - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {

        // 處理每次接收的數據

    }

    

    // 3.請求成功或者失敗(如果失敗,error有值)

    - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {

        // 請求完成,成功或者失敗的處理

    }

NSURLSessionDownloadTask

文件下載可以使用NSURLSessionDownloadTask這個子類.

簡單下載

  NSURLSession *session = [NSURLSession sharedSession];

    NSURL *url = [NSURL URLWithString:@"http://www."] ;

    NSURLSessionDownloadTask *task = [session downloadTaskWithURL:url completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {

        // location是沙盒中tmp文件夾下的一個臨時url,文件下載後會存到這個位置,由於tmp中的文件隨時可能被刪除,所以我們需要自己需要把下載的文件挪到需要的地方

        NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];

        // 剪切文件

        [[NSFileManager defaultManager] moveItemAtURL:location toURL:[NSURL fileURLWithPath:path] error:nil];

    }];

    // 啓動任務

    [task resume];

NSURLSessionDownloadDelegate代理方法

 // 每次寫入調用(會調用多次)

    - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {

        // 可在這裏通過已寫入的長度和總長度算出下載進度

        CGFloat progress = 1.0 * totalBytesWritten / totalBytesExpectedToWrite; NSLog(@"%f",progress);

    }

    

    // 下載完成調用

    - (void)URLSession:(NSURLSession *)session

downloadTask:(NSURLSessionDownloadTask *)downloadTask

didFinishDownloadingToURL:(NSURL *)location {

    // location還是一個臨時路徑,需要自己挪到需要的路徑(caches下面)

    NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:downloadTask.response.suggestedFilename];

    [[NSFileManager defaultManager] moveItemAtURL:location toURL:[NSURL fileURLWithPath:filePath] error:nil];

}

    

    // 任務完成調用

    - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {

        

    }


NSURLSessionUploadTask

在NSURLSession中,文件上傳方式主要有以下兩種:處於安全性考慮,通常我們會使用POST方式進行文件上傳,所以較多使用第二種

1、    NSURLSessionUploadTask *task =  [[NSURLSession sharedSession] uploadTaskWithRequest:request  fromFile:fileName

                                      completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

                                      }];

    

2、    [self.session uploadTaskWithRequest:request fromData:body

                      completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

                          NSLog(@"-------%@", [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]);

                      }];

    

斷點下載

NSURLSessionDownloadTask提供了與斷點下載相關的幾個方法:

 // 使用這種方式取消下載可以得到將來用來恢復的數據,保存起來

    [self.task cancelByProducingResumeData:^(NSData *resumeData) {

        self.resumeData = resumeData;

    }];

    

    // 由於下載失敗導致的下載中斷會進入此協議方法,也可以得到用來恢復的數據

    - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error

    {

        // 保存恢復數據

        self.resumeData = error.userInfo[NSURLSessionDownloadTaskResumeData];

    }

    

    // 恢復下載時接過保存的恢復數據

    self.task = [self.session downloadTaskWithResumeData:self.resumeData];

    // 啓動任務

    [self.task resume];


task擁有下面幾個方法

- (void)suspend;   可以讓當前的任務暫停

- (void)resume;    不僅可以啓動任務,還可以喚醒suspend狀態的任務

- (void)cancel;   可以取消當前的任務,你也可以向處於suspend狀態的任務發送cancel消息,任務如果被取消便不能再恢復到之前的狀態.

NSURLSessionConfiguration:session的配置信息

NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];

// 超時時間

config.timeoutIntervalForRequest = 10;

// 是否允許使用蜂窩網絡(後臺傳輸不適用)

config.allowsCellularAccess = YES;

// 還有很多可以設置的屬性

有沒有發現我們使用的Configuration都是默認配置:[NSURLSessionConfiguration defaultSessionConfiguration],其實它的配置有三種類型:


+ (NSURLSessionConfiguration *)defaultSessionConfiguration;

+ (NSURLSessionConfiguration *)ephemeralSessionConfiguration;

+ (NSURLSessionConfiguration *)backgroundSessionConfigurationWithIdentifier:(NSString *)identifier








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章