標籤:
#import "ViewController.h"@interface ViewController ()<NSURLSessionDataDelegate>/** 接受響應體資訊 */@property (nonatomic, strong) NSMutableData *fileData;@end@implementation ViewController-(NSMutableData *)fileData{ if (_fileData == nil) { _fileData = [NSMutableData data]; } return _fileData;}-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ //1.url NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=123&pwd=123&type=JSON"]; //2.建立請求對象 NSURLRequest *request = [NSURLRequest requestWithURL:url]; //3.建立會話對象,設定代理 /* 第一個參數:配置資訊 [NSURLSessionConfiguration defaultSessionConfiguration] 第二個參數:代理 第三個參數:設定代理方法在哪個線程中調用 */ NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]]; //4.建立Task NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request]; //5.執行Task [dataTask resume];}#pragma mark ----------------------#pragma mark NSURLSessionDataDelegate/** * 1.接收到伺服器的響應 它預設會取消該請求 * * @param session 會話對象 * @param dataTask 請求任務 * @param response 回應標頭資訊 * @param completionHandler 回調 傳給系統 */-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{ NSLog(@"%s",__func__); /* NSURLSessionResponseCancel = 0,取消 預設 NSURLSessionResponseAllow = 1, 接收 NSURLSessionResponseBecomeDownload = 2, 變成下載任務 NSURLSessionResponseBecomeStream 變成流 */ completionHandler(NSURLSessionResponseAllow);}/** * 接收到伺服器返回的資料 調用多次 * * @param session 會話對象 * @param dataTask 請求任務 * @param data 本次下載的資料 */-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{ NSLog(@"%s",__func__); //拼接資料 [self.fileData appendData:data];}/** * 請求結束或者是失敗的時候調用 * * @param session 會話對象 * @param dataTask 請求任務 * @param error 錯誤資訊 */-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{ NSLog(@"%s",__func__); //解析資料 NSLog(@"%@",[[NSString alloc]initWithData:self.fileData encoding:NSUTF8StringEncoding]);}@end
(1)建立NSURLSession對象,設定代理(預設配置)
```objc
//1.建立NSURLSession,並設定代理
/*
第一個參數:session對象的全域配置設定,一般使用預設配置就可以
第二個參數:誰成為session對象的代理
第三個參數:代理方法在哪個隊列中執行(在哪個線程中調用),如果是主隊列那麼在主線程中執行,如果是非主隊列,那麼在子線程中執行
*/
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
```
(2)根據Session對象建立一個NSURLSessionDataTask任務(post和get選擇)
```objc
//建立task
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/images/minion_01.png"];
//注意:如果要發送POST請求,那麼請使用dataTaskWithRequest,設定一些要求標頭資訊
NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url];
```
(3)執行任務(其它方法,如暫停、取消等)
```objc
//啟動task
//[dataTask resume];
//其它方法,如取消任務,暫停任務等
//[dataTask cancel];
//[dataTask suspend];
```
(4)遵守代理協議,實現代理方法(3個相關的代理方法)
```objc
/*
1.當接收到伺服器響應的時候調用
session:發送請求的session對象
dataTask:根據NSURLSession建立的task任務
response:伺服器響應資訊(回應標頭)
completionHandler:通過該block回調,告訴伺服器端是否接收返回的資料
*/
-(void)URLSession:(nonnull NSURLSession *)session dataTask:(nonnull NSURLSessionDataTask *)dataTask didReceiveResponse:(nonnull NSURLResponse *)response completionHandler:(nonnull void (^)(NSURLSessionResponseDisposition))completionHandler
/*
2.當接收到伺服器返回的資料時調用
該方法可能會被調用多次
*/
-(void)URLSession:(nonnull NSURLSession *)session dataTask:(nonnull NSURLSessionDataTask *)dataTask didReceiveData:(nonnull NSData *)data
/*
3.當請求完成之後調用該方法
不論是請求成功還是請求失敗都調用該方法,如果請求失敗,那麼error對象有值,否則那麼error對象為空白
*/
-(void)URLSession:(nonnull NSURLSession *)session task:(nonnull NSURLSessionTask *)task didCompleteWithError:(nullable NSError *)error
```
(5)當接收到伺服器響應的時候,告訴伺服器接收資料(調用block)
```objc
//預設情況下,當接收到伺服器響應之後,伺服器認為用戶端不需要接收資料,所以後面的代理方法不會調用
//如果需要繼續接收伺服器返回的資料,那麼需要調用block,並傳入對應的策略
/*
NSURLSessionResponseCancel = 0, 取消任務
NSURLSessionResponseAllow = 1, 接收任務
NSURLSessionResponseBecomeDownload = 2, 轉變成下載
NSURLSessionResponseBecomeStream NS_ENUM_AVAILABLE(10_11, 9_0) = 3, 轉變成流
*/
completionHandler(NSURLSessionResponseAllow);
```
---
ios開發網路學八:NSURLSession相關代理方法