簡介
NSURLSession也能也能完成網絡請求
NSURLConnection在iOS9中不推薦使用,NSURLSession是iOS9中推薦使用的網絡請求方式
NSURLConnection需要與NSURLSessionTask配合使用
NSURLSession的簡單使用步驟
創建請求任務
執行請求任務
通常使用NSURLSessionTask的子類來創建任務
NSURLSession
NSURLSession對象的獲取方法
獲取全局的NSURLSession對象(無法設置代理)
+ (NSURLSession *)sharedSession;
通過NSURLSessionConfiguration獲取(可以設置代理),NSURLSessionConfiguration類通常用來設置一些請求參數
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration delegate:(nullable id
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];
1
創建請求任務
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];
實現代理方法做進一步處理