iOS網絡-03-NSURLSession與NSURLSessionTask


簡介


  • NSURLSession也能完成網絡請求
  • NSURLConnection在iOS9中不推薦使用,NSURLSession是iOS9中推薦使用的網絡請求方式
  • NSURLSession需要與NSURLSessionTask配合使用
  • NSURLSession的簡單使用步驟
    • 創建請求任務
    • 執行請求任務
  • 通常使用NSURLSessionTask的子類來創建任務

NSURLSession


  • NSURLSession對象的獲取方法
    • 獲取全局的NSURLSession對象(無法設置代理

      + (NSURLSession *)sharedSession
      
    • 通過NSURLSessionConfiguration獲取(可以設置代理),NSURLSessionConfiguration類通常用來設置一些請求參數

      + (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration delegate:(nullable id <NSURLSessionDelegate>)delegate delegateQueue:(nullable NSOperationQueue *)queue
      

NSURLSessionTask


  • 常用的屬性
    • taskIdentifier(NSUInteger, readonly),任務標識,唯一確定一個任務
    • originalRequest(NSURLRequest *, readonly),上一個請求對象
    • currentRequest(NSURLRequest *, readonly),當前請求對象
    • response(NSURLResponse *, readonly),服務器的響應數據
    • countOfBytesReceived(int64_t, readonly),已經接收到的數據量
    • countOfBytesExpectedToReceive(int64_t, readonly),所要接收到的總數據量
    • countOfBytesSent(int64_t, readonly),已經發送的數據量
    • countOfBytesExpectedToSend(int64_t, readonly),所要發送的總數據量
    • taskDescription(NSString *),任務描述
    • state(NSURLSessionTaskState, readonly),任務的狀態
    • error(NSError *, readonly),錯誤信息
    • priority(float),任務的優先級
  • 常用的方法(任務的狀態控制)
    • - (void)cancel,取消任務
    • - (void)suspend,暫停任務
    • - (void)resume,繼續任務
  • 任務優先級屬性priority的取值
    • NSURLSessionTaskPriorityDefault
    • NSURLSessionTaskPriorityLow
    • NSURLSessionTaskPriorityHigh
  • NSURLSessionTask
    • NSURLSessionDataTask,該子類沒有擴充屬性和方法,只是為了與NSURLSessionUploadTask和NSURLSessionDownloadTask區分

    • NSURLSessionUploadTask,用於上傳任務

    • NSURLSessionDownloadTask,提供了一個取消任務的方法,但是會保存用於以后繼續任務的信息,方法如下:

      - (void)cancelByProducingResumeData:(void (^)(NSData * __nullable resumeData))completionHandler;
      

與NSURLSession相關的代理協議


  • NSURLSessionDelegate
  • NSURLSessionTaskDelegate,遵守NSURLSessionDelegate協議
  • NSURLSessionDataDelegate,遵守NSURLSessionTaskDelegate協議,是網絡請求通常遵循的協議,常用的方法:
    • 接受到服務響應時調用的方法

      - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler;
      /**
      * 必須在該方法中對服務器的響應進行授權,才能繼續接收服務器返回的數據,調用如下函數
      * completionHandler(NSURLSessionResponseAllow)
      */
      
    • 接收到服務器返回的數據時調用的方法

      - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
      /**
      * data:服務返回的數據,通常為JSON格式數據
      */
      
    • 請求完成時調用的方法(成功或失敗)

      - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(nullable NSError *)error
      /**
      * 若出現錯誤,error中存放錯誤信息
      */
      
  • NSURLSessionDownloadDelegate(通常用於下載大量數據),遵守NSURLSessionTaskDelegate協議,常用的方法:
    • 寫入數據到臨時文件時調用的方法(服務器返回一點就寫入一點)

      - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
      /**
      * totalBytesWritten,已寫入數據的總長度
      * totalBytesExpectedToWrite:總共要寫入數據的總長度
      * 可以在該方法中計算下載進度
      */
      
    • 遇到錯誤的時候調用

      - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
      /**
      *error:若遇到錯誤,則保存錯誤信息
      */
      
    • 用於斷點下載的方法

      - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes
      /**
      * fileOffset:繼續下載時,文件的開始位置
      * expectedTotalBytes:剩余的數據總數
      */
      
    • 下載完成時調用的方法

      - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
      /**
      * location:下載的文件保存的臨時位置
      * 需要將下載的文件保存在可以長期保存的位置
      */
      

NSURLSession網絡請求


  • Block回調的方式
    • 獲取NSURLSession對象

      NSURLSession *session =[NSURLSession sharedSession];
      
    • 創建請求任務

      NSURLSessionTask *task = [session downloadTaskWithURL:(此處為請求的URL路徑) completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
      	//此處為請求任務完成后的回調Block,即:任務完成后會執行這里的代碼
      	}];
      
    • 啟動任務

      [task resume];
      
  • 代理的方式
    • 獲得NSURLSession對象

      NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc] init]];
      
    • 創建請求任務

      NSURLSessionTask *task = [session dataTaskWithRequest:(此處為NSURLRequest對象)];
      
    • 啟動任務

      [task resume];
      
    • 實現代理方法做進一步處理


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM