iOS NSURLSession的使用


使用NSURLSession發起的網絡請求都當成任務,分為三種任務:

  • NSURLSessionDataTask: 基本數據請求任務
  • NSURLSessionDownloadTask: 下載任務,支持后臺下載和暫停續傳
  • NSURLSessionUploadTask: 上傳任務,支持后臺上傳和暫停續傳

所有的任務都是有Session發起的,默認所有的任務都是"掛起"的,需要resume才會執行

dataTask基本數據請求

    NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/data.json"];
    //1.創建全局單例
    NSURLSession *session = [NSURLSession sharedSession];
    //2.所有的任務由session發起
    NSURLSessionTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        //3.反序列化,json數據
        id result = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
        
        NSLog(@"%@",result);
    }];
    //4.啟動任務
    [task resume];

downLoadTask下載任務

- (NSURLSession *)session {
    if (!_session) {
        //config 提供了一個全局的網絡環境配置,包括:身份驗證,瀏覽器類型,cookie,緩存,超時...
        NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
        _session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
    }
    return _session;
}
     NSURL *url = [NSURL URLWithString:@"http://sw.bos.baidu.com/sw-search-sp/software/84d6cbfd4a092/QQ_mac_6.1.1.dmg"];
   
    //downloadTask下載
    //如果需要跟進下載進度progress,不能使用Block回調方式
    [[self.session downloadTaskWithURL:url completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        //文件路徑,存在temp文件夾中
        NSLog(@"%@",location);
        //下載zip包解壓縮操作
        //......
    }] resume];

注意: 如果在回調Block方法中,不做任何處理,下載的文件放在temp文件夾里,馬上會自動刪除,系統自動回收這塊區域! 設計的目的是什么?
- 通常從網絡上下載文件,什么格式文件最多 -> zip 文件最多!可以替用戶節約流量!
- 如果是 zip 包,下載之后,需要解壓
- 解壓縮之后,原始的 zip 文件就不在需要了.系統會自動幫我們刪除!

跟進下載進度,需要實現NSURLSessionDownloadDelegate代理方法

NSURL *url = [NSURL URLWithString:@"http://sw.bos.baidu.com/sw-search-sp/software/84d6cbfd4a092/QQ_mac_6.1.1.dmg"];
    //注意:如果要跟進下載進度,不能使用Block回調方式,負責代理方法不執行
[[self.session downloadTaskWithURL:url] resume];
/// MARK: - NSURLSessionDownloadDelegate代理
//iOS 7.0以前,三個方法都必須時間
//1.下載完成方法 iOS 8.0以后 這個方法必須實現
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{
    
    NSLog(@"%@",location);
}

//2.下載進度監聽方法
/**
 bytesWritten 本次下載的字節數
 totalBytesWritten 已經下載的字節數
 totalBytesExpectedToWrite 文件的總大小
 */
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{
    
    //下載進度
    float progress = (float)totalBytesWritten/totalBytesExpectedToWrite;
    NSLog(@"%f",progress);
    //主線程刷新UI
    dispatch_async(dispatch_get_main_queue(), ^{
        //NSLog(@"%@",[NSThread currentThread]);
        self.progressLabel.text = [NSString stringWithFormat:@"%0.0f%%",progress * 100];
        self.progressView.progress = progress;
    });
    
}

//3.下載續傳
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes{
    
}

續傳任務

//開始下載
- (IBAction)start:(id)sender {

    NSURL *url = [NSURL URLWithString:@"http://sw.bos.baidu.com/sw-search-sp/software/84d6cbfd4a092/QQ_mac_6.1.1.dmg"];
    //downloadTask下載
    self.downLoadTask = [self.session downloadTaskWithURL:url];
    [self.downLoadTask resume];
}

//暫停
- (IBAction)stop:(id)sender {
    NSLog(@"暫停");
    [self.downLoadTask cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
        //resumeData  續傳數據
        NSLog(@"下載數據的長度:%lu",resumeData.length);
        self.resumeData = resumeData;
        //釋放下載任務
        self.downLoadTask = nil;
    }];
}

//繼續
- (IBAction)resume:(id)sender {
    if (self.resumeData == nil) {
        NSLog(@"沒有暫停的任務");
        return;
    }
    
    //續傳下載任務
    self.downLoadTask = [self.session downloadTaskWithResumeData:self.resumeData];
    //重新開啟任務
    [self.downLoadTask resume];
    //清空續傳數據
    self.resumeData = nil;
}
代碼鏈接

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容