

#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);
```
---
