簡介
- 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];
-
實現代理方法做進一步處理
-