365bet体育在线客户端iOS —— NNSUCRUISERLSessionDataTask

iOS —— NNSURLSessionDataTask,nsurlsessiondatatask

二、示例代码

因为笔者是把具有的代码写到一个 demo
里的,所以有个别前段时间无需的东西得以不要求理会

1)GET/POST 请求

第一在 main.storyboard 中拖入一个UINavigationController ,并设置 static cell,如图

365bet体育在线客户端 1

 

然后拖入七个 UIViewController 并当选第三个cell,即 NSULX570LSessionDataTask,将 cell 和 UIViewController 连线,选用push

在那么些 UIViewController
中拖入一多种控件,如图

365bet体育在线客户端 2

 

右上角的 UIBarButtonItem
是跳转到下二个分界面包车型客车,不用管它

UIViewController 中的代码如下

 

 1 #import "LHDataTaskViewController.h"
 2 
 3 // GET 请求的 URL
 4 static NSString * imageURL = @"http://120.25.226.186:32812/resourcesminion_01.png";
 5 
 6 // POST 请求的 URL
 7 static NSString * dataURL = @"http://api.hudong.com/iphonexml.do";
 8 
 9 @interface LHDataTaskViewController ()
10 
11 #pragma mark - 属性
12 @property (weak, nonatomic) IBOutlet UIImageView *showImageView;
13 
14 @property (nonatomic, strong) NSURLSession * session;
15 @property (nonatomic, strong) NSURLSessionDataTask * dataTask;
16 
17 @end
18 
19 @implementation LHDataTaskViewController
20 
21 #pragma mark - ViewController 生命周期
22 - (void)viewDidLoad {
23     
24     [super viewDidLoad];
25     
26     // 1. 初始化 NSURLSession 对象
27     self.session = [NSURLSession sharedSession];
28 
29 }
30 
31 - (void)didReceiveMemoryWarning {
32     
33     [super didReceiveMemoryWarning];
34 
35 }

 

 

  1. GET
    请求

安装 “GET需要” 按键的 动作方法

 

 1 #pragma mark - button 动作方法
 2 #pragma mark 发送 GET 请求获取图片资源
 3 - (IBAction)GETButtonClick:(id)sender {
 4     
 5     NSLog(@"dataTask的状态 --- %li", _dataTask.state);
 6     
 7     // 1. 初始化 NSURLSesionDataTask 对象
 8     self.dataTask = [_session dataTaskWithURL:[NSURL URLWithString:imageURL] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
 9                 
10         // 1). 定义 UIImage 对象,并用接受的数据(data)初始化
11         UIImage * image = [UIImage imageWithData:data];
12         
13         // 2). 返回主线程刷新UI
14         dispatch_async(dispatch_get_main_queue(), ^{
15             
16             self.showImageView.image = image;
17             
18         });
19         
20         NSLog(@"dataTask的状态 --- %li", _dataTask.state);
21         
22         // 此时,所有数据已经全部接受完毕,所以,已经接受的的数据和所要接受的总数据是相等的
23         // 因为没有发送数据,所以发送数据都为 0
24         NSLog(@"已接受到的数据量 --- %lli", _dataTask.countOfBytesReceived); // 48347
25         NSLog(@"所要接受到的数据总量 --- %lli", _dataTask.countOfBytesExpectedToReceive); // 48347
26         NSLog(@"已经发送的数据量 --- %lli", _dataTask.countOfBytesSent); // 0
27         NSLog(@"所要发送的数据总量 --- %lli", _dataTask.countOfBytesExpectedToSend); // 0
28         
29     }];
30     
31     // 2. 发送请求,执行 task
32     [_dataTask resume];
33     
34 }

 

中间,24行 —— 27行 中用到的质量,是
NSULANDLSessionTask
类中的属性,能够落成获取数据的进程,不过只好在代理中落到实处,因为在上述的办法中,是已经全体呼吁到数码后才实践的回调

瞩目 : NSUENCORELSessionTask 中有着的 task
都亟需 resume 来伊始

 

运作结果

365bet体育在线客户端 3

365bet体育在线客户端 4

 

  1. POST
    请求

安装 “POST须要” 开关的动作方法

 

 1 - (IBAction)POSTButtonClick:(UIButton *)sender {
 2     
 3     // 1. 创建请求对象(可变)
 4     NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:dataURL]];
 5     
 6     // 2. 设置请求方法为 POST 请求
 7     request.HTTPMethod = @"POST";
 8     
 9     request.HTTPBody = [@"type=focus-c" dataUsingEncoding:NSUTF8StringEncoding];
10     
11     // 1. 初始化 NSURLSessionDataTask 对象
12     self.dataTask = [_session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
13         
14         NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
15         
16     }];
17     
18     [_dataTask resume];
19     
20 }

 

运维结果

365bet体育在线客户端 5

 

2. 代理

动用代理的章程来开始展览互联网须求,何况能够监督央浼进程

后天 mian.storyboard 中拖入一个UIViewController 并增加控件,如图

365bet体育在线客户端 6

 

此次必要的是一张图片数据,恳求完今后会将图片展示到显示器上的
UIImageView,resume 按键是开首乞请,pause 开关是暂停央求,cance
按键是收回央浼,中间还会有一个UIProgressView,用于显示央浼的快慢,并将那几个控件与插座变量关联

 

UIViewController 中的代码如下,该
ViewController 要严守有关心下一代组织商 <NSU凯雷德LSessionDataDelegate>

 

 1 #import "LHDataTaskDownloadViewController.h"
 2 
 3 // 待访问的 URL
 4 static NSString * imageURL = @"http://f12.topit.me/o129/10129120625790e866.jpg";
 5 
 6 @interface LHDataTaskDownloadViewController () <NSURLSessionDataDelegate>
 7 
 8 #pragma mark - 属性列表
 9 #pragma mark 插座变量
10 @property (weak, nonatomic) IBOutlet UIImageView *showImageView;
11 @property (weak, nonatomic) IBOutlet UIProgressView *progressView;
12 @property (weak, nonatomic) IBOutlet UIButton *resumeButton;
13 @property (weak, nonatomic) IBOutlet UIButton *pauseButton;
14 @property (weak, nonatomic) IBOutlet UIButton *cancelButton;
15 
16 #pragma mark 网络对象
17 @property (nonatomic, strong) NSURLSession * session;
18 @property (nonatomic, strong) NSURLSessionDataTask * dataTask;
19 
20 #pragma mark 用于接受请求数据的对象
21 @property (nonatomic, strong) NSMutableData * data;
22 
23 @end
24 
25 @implementation LHDataTaskDownloadViewController
26 
27 - (void)viewDidLoad {
28     
29     [super viewDidLoad];
30     
31     // 1. 初始化 NSURLSession 对象,delegateQueue 为协议方法运行的线程,传 nil 则在子线程中运行
32     self.session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil];
33     
34     // 2. 初始化 NSURLSessionDataTask 对象,默认为 GET
35     self.dataTask = [_session dataTaskWithURL:[NSURL URLWithString:imageURL]];
36     
37     // 2. 将 cancelButton 和 pauseButton 按钮设置为不可用
38     _cancelButton.enabled = NO;
39     
40     _pauseButton.enabled = NO;
41 
42 }

 

 

开班开关的动作方法

 1 - (IBAction)resumeButtonClick:(id)sender {
 2     
 3     // 1. 判断当前的状态,data task 默认为 暂停状态
 4     if (_dataTask.state == NSURLSessionTaskStateSuspended) {
 5         
 6         _pauseButton.enabled = YES;
 7         
 8         _cancelButton.enabled = YES;
 9     
10         // 1). 开始请求 task
11         [_dataTask resume];
12     
13     }
14     
15 }

 

停顿按键的动作方法

 1 - (IBAction)pauseButtonClick:(id)sender {
 2     
 3     // 1. 判断 task 当前的状态,如果处于正在接受数据的状态,则暂停
 4     if (_dataTask.state == NSURLSessionTaskStateRunning) {
 5     
 6         [_dataTask suspend];
 7     
 8     }
 9     
10 }

 

注销按键的动作方法

 1 - (IBAction)cancelButtonClick:(id)sender {
 2     
 3     // 1. 判断 task 当前的状态,如果处于正在接受数据的状态或暂停状态,则取消
 4     if (_dataTask.state == NSURLSessionTaskStateRunning || _dataTask.state == NSURLSessionTaskStateSuspended) {
 5     
 6         // 1). 取消 task
 7         [_dataTask cancel];
 8         
 9         // 2). 设置滑动条的值
10         _progressView.progress = 0;
11         
12         // 3). 创建对话框VC
13         UIAlertController * alertVC = [UIAlertController alertControllerWithTitle:@"提示" message:@"该 Task 已经被取消" preferredStyle:UIAlertControllerStyleAlert];
14         
15         // 4). 显示对话框VC
16         [self presentViewController:alertVC animated:YES completion:nil];
17         
18         // 5). 创建动作按钮
19         UIAlertAction * cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
20            
21             [self.navigationController popViewControllerAnimated:YES];
22             
23         }];
24         
25         // 6). 将动作按钮添加到对话框VC
26         [alertVC addAction:cancelAction];
27     
28     }
29     
30 }

 

谐和议程

#pragma mark 接收到服务器响应时调用,默认情况下不接受数据,所以要允许
// @param session 当前的会话对象
// @param dataTask 当前的 data task 对象
// @param response 响应头对象
// @param completionHandler 回调
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler {

    NSLog(@"%@", NSStringFromSelector(_cmd));

    // 1. 初始化数据对象
    self.data = [[NSMutableData alloc] init];

    // 2. 允许接受数据,如果没有写这句,则后面代理的方法不会被执行
    completionHandler(NSURLSessionResponseAllow);

}

内部,NSU奥迪Q3LSessionResponseDisposition
是二个枚举

1 typedef NS_ENUM(NSInteger, NSURLSessionResponseDisposition) {
2     NSURLSessionResponseCancel = 0,        // 取消接受数据,之后的代理方法不会被执行,相当于 [task cancel];          
3     NSURLSessionResponseAllow = 1,         // 允许接受数据,之后的代理方法会被执行
4     NSURLSessionResponseBecomeDownload = 2,// 使当前的 data task 变为 download task,当转换为 download task 时,会将数据下载到临时文件 tmp 中;此时,task 就变为 下载任务了,并且必须实现 URLSession:dataTask:didBecomeDownloadTask: 方法,并且在该方法中可以什么都不写,但必须被调用           
5     NSURLSessionResponseBecomeStream NS_ENUM_AVAILABLE(10_11, 9_0) = 3,// 使当前的 data task 变为 stream task
6 } NS_ENUM_AVAILABLE(NSURLSESSION_AVAILABLE, 7_0);

 

 1 #pragma mark 接受到数据时调用,可能会调用多次
 2 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
 3     
 4     NSLog(@"%@", NSStringFromSelector(_cmd));
 5     
 6     // 1. 拼接收到的数据
 7     [self.data appendData:data];
 8     
 9     // 2. 回到主线程刷新 UI,用 NSURLSessionTask 中的属性,已经接受的数据/总共需要接受的数据,来实现进度条
10     dispatch_async(dispatch_get_main_queue(), ^{
11        
12         _progressView.progress = (float)_dataTask.countOfBytesReceived/_dataTask.countOfBytesExpectedToReceive;
13         
14     });
15     
16 }

 

 1 #pragma mark 请求结束或失败时调用
 2 - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
 3 
 4     NSLog(@"%@", NSStringFromSelector(_cmd));
 5     
 6     UIImage * image = [UIImage imageWithData:_data];
 7     
 8     dispatch_async(dispatch_get_main_queue(), ^{
 9         
10         NSLog(@"currentThread --- %@", [NSThread currentThread]);
11         
12         self.showImageView.image = image;
13         
14     });
15 
16 }

以此艺术并非 NSUPAJEROLSessionTaskDelegate
协议中的方法,适合全部的 task

运转结果 

365bet体育在线客户端 7

 

总结 : 

在 task 起首以前(即进行 resume
方法从前),task 的景况是暂停的,即NSURAV4LSessionTaskStateSuspended

在 task 正在经受多少的长河中,task
的境况是 NSUWranglerLSessionTaskStateRunning

 

二、示例代码

因为作者是把富有的代码写到贰个 demo
里的,所以有个别近来无需的事物能够不必理会

1)GET/POST 请求

先是在 main.storyboard 中拖入三个UINavigationController ,并设置 static cell,如图

365bet体育在线客户端 8

 

接下来拖入二个 UIViewController 并当选第二个cell,即 NSU本田CR-VLSessionDataTask,将 cell 和 UIViewController 连线,接纳push

在那个 UIViewController
中拖入一层层控件,如图

365bet体育在线客户端 9

 

右上角的 UIBarButtonItem
是跳转到下叁个分界面包车型地铁,不用管它

UIViewController 中的代码如下

 

 1 #import "LHDataTaskViewController.h"
 2 
 3 // GET 请求的 URL
 4 static NSString * imageURL = @"http://120.25.226.186:32812/resourcesminion_01.png";
 5 
 6 // POST 请求的 URL
 7 static NSString * dataURL = @"http://api.hudong.com/iphonexml.do";
 8 
 9 @interface LHDataTaskViewController ()
10 
11 #pragma mark - 属性
12 @property (weak, nonatomic) IBOutlet UIImageView *showImageView;
13 
14 @property (nonatomic, strong) NSURLSession * session;
15 @property (nonatomic, strong) NSURLSessionDataTask * dataTask;
16 
17 @end
18 
19 @implementation LHDataTaskViewController
20 
21 #pragma mark - ViewController 生命周期
22 - (void)viewDidLoad {
23     
24     [super viewDidLoad];
25     
26     // 1. 初始化 NSURLSession 对象
27     self.session = [NSURLSession sharedSession];
28 
29 }
30 
31 - (void)didReceiveMemoryWarning {
32     
33     [super didReceiveMemoryWarning];
34 
35 }

 

 

  1. GET
    请求

设置 “GET央求” 按键的 动作方法

 

 1 #pragma mark - button 动作方法
 2 #pragma mark 发送 GET 请求获取图片资源
 3 - (IBAction)GETButtonClick:(id)sender {
 4     
 5     NSLog(@"dataTask的状态 --- %li", _dataTask.state);
 6     
 7     // 1. 初始化 NSURLSesionDataTask 对象
 8     self.dataTask = [_session dataTaskWithURL:[NSURL URLWithString:imageURL] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
 9                 
10         // 1). 定义 UIImage 对象,并用接受的数据(data)初始化
11         UIImage * image = [UIImage imageWithData:data];
12         
13         // 2). 返回主线程刷新UI
14         dispatch_async(dispatch_get_main_queue(), ^{
15             
16             self.showImageView.image = image;
17             
18         });
19         
20         NSLog(@"dataTask的状态 --- %li", _dataTask.state);
21         
22         // 此时,所有数据已经全部接受完毕,所以,已经接受的的数据和所要接受的总数据是相等的
23         // 因为没有发送数据,所以发送数据都为 0
24         NSLog(@"已接受到的数据量 --- %lli", _dataTask.countOfBytesReceived); // 48347
25         NSLog(@"所要接受到的数据总量 --- %lli", _dataTask.countOfBytesExpectedToReceive); // 48347
26         NSLog(@"已经发送的数据量 --- %lli", _dataTask.countOfBytesSent); // 0
27         NSLog(@"所要发送的数据总量 --- %lli", _dataTask.countOfBytesExpectedToSend); // 0
28         
29     }];
30     
31     // 2. 发送请求,执行 task
32     [_dataTask resume];
33     
34 }

 

个中,24行 —— 27行 中用到的性质,是
NSU奔驰G级LSessionTask
类中的属性,能够兑现获取数据的过程,可是只可以在代理中完结,因为在上述的主意中,是曾经整整呼吁到数码后才实施的回调

只顾 : NSULacrosseLSessionTask 中保有的 task
都必要 resume 来开端

 

运作结果

365bet体育在线客户端 10

365bet体育在线客户端 11

 

  1. POST
    请求

安装 “POST央求” 按键的动作方法

 

 1 - (IBAction)POSTButtonClick:(UIButton *)sender {
 2     
 3     // 1. 创建请求对象(可变)
 4     NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:dataURL]];
 5     
 6     // 2. 设置请求方法为 POST 请求
 7     request.HTTPMethod = @"POST";
 8     
 9     request.HTTPBody = [@"type=focus-c" dataUsingEncoding:NSUTF8StringEncoding];
10     
11     // 1. 初始化 NSURLSessionDataTask 对象
12     self.dataTask = [_session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
13         
14         NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
15         
16     }];
17     
18     [_dataTask resume];
19     
20 }

 

运维结果

365bet体育在线客户端 12

 

2. 代理

使用代理的措施来开始展览互连网央求,而且能够监察和控制央求进程

先天 mian.storyboard 中拖入多少个UIViewController 并增加控件,如图

365bet体育在线客户端 13

 

本次须要的是一张图纸数据,央求完以往会将图片显示到屏幕上的
UIImageView,resume 按键是初步乞求,pause 开关是暂停央求,cance
按键是打消央求,中间还只怕有三个UIProgressView,用于展现供给的速度,并将那几个控件与插座变量关联

 

UIViewController 中的代码如下,该
ViewController 要遵从相关心下一代组织议 <NSULacrosseLSessionDataDelegate>

 

 1 #import "LHDataTaskDownloadViewController.h"
 2 
 3 // 待访问的 URL
 4 static NSString * imageURL = @"http://f12.topit.me/o129/10129120625790e866.jpg";
 5 
 6 @interface LHDataTaskDownloadViewController () <NSURLSessionDataDelegate>
 7 
 8 #pragma mark - 属性列表
 9 #pragma mark 插座变量
10 @property (weak, nonatomic) IBOutlet UIImageView *showImageView;
11 @property (weak, nonatomic) IBOutlet UIProgressView *progressView;
12 @property (weak, nonatomic) IBOutlet UIButton *resumeButton;
13 @property (weak, nonatomic) IBOutlet UIButton *pauseButton;
14 @property (weak, nonatomic) IBOutlet UIButton *cancelButton;
15 
16 #pragma mark 网络对象
17 @property (nonatomic, strong) NSURLSession * session;
18 @property (nonatomic, strong) NSURLSessionDataTask * dataTask;
19 
20 #pragma mark 用于接受请求数据的对象
21 @property (nonatomic, strong) NSMutableData * data;
22 
23 @end
24 
25 @implementation LHDataTaskDownloadViewController
26 
27 - (void)viewDidLoad {
28     
29     [super viewDidLoad];
30     
31     // 1. 初始化 NSURLSession 对象,delegateQueue 为协议方法运行的线程,传 nil 则在子线程中运行
32     self.session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil];
33     
34     // 2. 初始化 NSURLSessionDataTask 对象,默认为 GET
35     self.dataTask = [_session dataTaskWithURL:[NSURL URLWithString:imageURL]];
36     
37     // 2. 将 cancelButton 和 pauseButton 按钮设置为不可用
38     _cancelButton.enabled = NO;
39     
40     _pauseButton.enabled = NO;
41 
42 }

 

 

开班按键的动作方法

 1 - (IBAction)resumeButtonClick:(id)sender {
 2     
 3     // 1. 判断当前的状态,data task 默认为 暂停状态
 4     if (_dataTask.state == NSURLSessionTaskStateSuspended) {
 5         
 6         _pauseButton.enabled = YES;
 7         
 8         _cancelButton.enabled = YES;
 9     
10         // 1). 开始请求 task
11         [_dataTask resume];
12     
13     }
14     
15 }

 

暂停开关的动作方法

 1 - (IBAction)pauseButtonClick:(id)sender {
 2     
 3     // 1. 判断 task 当前的状态,如果处于正在接受数据的状态,则暂停
 4     if (_dataTask.state == NSURLSessionTaskStateRunning) {
 5     
 6         [_dataTask suspend];
 7     
 8     }
 9     
10 }

 

撤废按键的动作方法

 1 - (IBAction)cancelButtonClick:(id)sender {
 2     
 3     // 1. 判断 task 当前的状态,如果处于正在接受数据的状态或暂停状态,则取消
 4     if (_dataTask.state == NSURLSessionTaskStateRunning || _dataTask.state == NSURLSessionTaskStateSuspended) {
 5     
 6         // 1). 取消 task
 7         [_dataTask cancel];
 8         
 9         // 2). 设置滑动条的值
10         _progressView.progress = 0;
11         
12         // 3). 创建对话框VC
13         UIAlertController * alertVC = [UIAlertController alertControllerWithTitle:@"提示" message:@"该 Task 已经被取消" preferredStyle:UIAlertControllerStyleAlert];
14         
15         // 4). 显示对话框VC
16         [self presentViewController:alertVC animated:YES completion:nil];
17         
18         // 5). 创建动作按钮
19         UIAlertAction * cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
20            
21             [self.navigationController popViewControllerAnimated:YES];
22             
23         }];
24         
25         // 6). 将动作按钮添加到对话框VC
26         [alertVC addAction:cancelAction];
27     
28     }
29     
30 }

 

365bet体育在线客户端,磋商方式

#pragma mark 接收到服务器响应时调用,默认情况下不接受数据,所以要允许
// @param session 当前的会话对象
// @param dataTask 当前的 data task 对象
// @param response 响应头对象
// @param completionHandler 回调
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler {

    NSLog(@"%@", NSStringFromSelector(_cmd));

    // 1. 初始化数据对象
    self.data = [[NSMutableData alloc] init];

    // 2. 允许接受数据,如果没有写这句,则后面代理的方法不会被执行
    completionHandler(NSURLSessionResponseAllow);

}

里头,NSU福特ExplorerLSessionResponseDisposition
是多个枚举

1 typedef NS_ENUM(NSInteger, NSURLSessionResponseDisposition) {
2     NSURLSessionResponseCancel = 0,        // 取消接受数据,之后的代理方法不会被执行,相当于 [task cancel];          
3     NSURLSessionResponseAllow = 1,         // 允许接受数据,之后的代理方法会被执行
4     NSURLSessionResponseBecomeDownload = 2,// 使当前的 data task 变为 download task,当转换为 download task 时,会将数据下载到临时文件 tmp 中;此时,task 就变为 下载任务了,并且必须实现 URLSession:dataTask:didBecomeDownloadTask: 方法,并且在该方法中可以什么都不写,但必须被调用           
5     NSURLSessionResponseBecomeStream NS_ENUM_AVAILABLE(10_11, 9_0) = 3,// 使当前的 data task 变为 stream task
6 } NS_ENUM_AVAILABLE(NSURLSESSION_AVAILABLE, 7_0);

 

 1 #pragma mark 接受到数据时调用,可能会调用多次
 2 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
 3     
 4     NSLog(@"%@", NSStringFromSelector(_cmd));
 5     
 6     // 1. 拼接收到的数据
 7     [self.data appendData:data];
 8     
 9     // 2. 回到主线程刷新 UI,用 NSURLSessionTask 中的属性,已经接受的数据/总共需要接受的数据,来实现进度条
10     dispatch_async(dispatch_get_main_queue(), ^{
11        
12         _progressView.progress = (float)_dataTask.countOfBytesReceived/_dataTask.countOfBytesExpectedToReceive;
13         
14     });
15     
16 }

365bet官网娱乐场, 

 1 #pragma mark 请求结束或失败时调用
 2 - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
 3 
 4     NSLog(@"%@", NSStringFromSelector(_cmd));
 5     
 6     UIImage * image = [UIImage imageWithData:_data];
 7     
 8     dispatch_async(dispatch_get_main_queue(), ^{
 9         
10         NSLog(@"currentThread --- %@", [NSThread currentThread]);
11         
12         self.showImageView.image = image;
13         
14     });
15 
16 }

本条情势而不是 NSUPorsche718LSessionTaskDelegate
协议中的方法,适合全数的 task

运维结果 

365bet体育在线客户端 14

 

总结 : 

在 task 开头在此以前(即实行 resume
方法此前),task 的状态是搁浅的,即NSUOdysseyLSessionTaskStateSuspended

在 task 正在承受多少的历程中,task
的动静是 NSU奇骏LSessionTaskStateRunning

 

在拍卖下载任务的时候可以一贯把数据下载到磁盘

二、示例代码

因为本人是把具有的代码写到多个 demo
里的,所以有个别方今无需的事物能够不必理会

1)GET/POST 请求

先是在 main.storyboard 中拖入二个 UINavigationController ,并设置
static cell,如图

365bet体育在线客户端 15

 

下一场拖入一个 UIViewController 并当选第三个 cell,即
NSU翼虎LSessionDataTask,将 cell 和 UIViewController 连线,采取 push

在那么些 UIViewController 中拖入一多元控件,如图

365bet体育在线客户端 16

 

右上角的 UIBarButtonItem 是跳转到下三个分界面包车型大巴,不用管它

UIViewController 中的代码如下

 

 1 #import "LHDataTaskViewController.h"
 2 
 3 // GET 请求的 URL
 4 static NSString * imageURL = @"http://120.25.226.186:32812/resources/images/minion_01.png";
 5 
 6 // POST 请求的 URL
 7 static NSString * dataURL = @"http://api.hudong.com/iphonexml.do";
 8 
 9 @interface LHDataTaskViewController ()
10 
11 #pragma mark - 属性
12 @property (weak, nonatomic) IBOutlet UIImageView *showImageView;
13 
14 @property (nonatomic, strong) NSURLSession * session;
15 @property (nonatomic, strong) NSURLSessionDataTask * dataTask;
16 
17 @end
18 
19 @implementation LHDataTaskViewController
20 
21 #pragma mark - ViewController 生命周期
22 - (void)viewDidLoad {
23     
24     [super viewDidLoad];
25     
26     // 1. 初始化 NSURLSession 对象
27     self.session = [NSURLSession sharedSession];
28 
29 }
30 
31 - (void)didReceiveMemoryWarning {
32     
33     [super didReceiveMemoryWarning];
34 
35 }

 

 

  1. GET 请求

安装 “GET央求” 开关的 动作方法

 

 1 #pragma mark - button 动作方法
 2 #pragma mark 发送 GET 请求获取图片资源
 3 - (IBAction)GETButtonClick:(id)sender {
 4     
 5     NSLog(@"dataTask的状态 --- %li", _dataTask.state);
 6     
 7     // 1. 初始化 NSURLSesionDataTask 对象
 8     self.dataTask = [_session dataTaskWithURL:[NSURL URLWithString:imageURL] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
 9                 
10         // 1). 定义 UIImage 对象,并用接受的数据(data)初始化
11         UIImage * image = [UIImage imageWithData:data];
12         
13         // 2). 返回主线程刷新UI
14         dispatch_async(dispatch_get_main_queue(), ^{
15             
16             self.showImageView.image = image;
17             
18         });
19         
20         NSLog(@"dataTask的状态 --- %li", _dataTask.state);
21         
22         // 此时,所有数据已经全部接受完毕,所以,已经接受的的数据和所要接受的总数据是相等的
23         // 因为没有发送数据,所以发送数据都为 0
24         NSLog(@"已接受到的数据量 --- %lli", _dataTask.countOfBytesReceived); // 48347
25         NSLog(@"所要接受到的数据总量 --- %lli", _dataTask.countOfBytesExpectedToReceive); // 48347
26         NSLog(@"已经发送的数据量 --- %lli", _dataTask.countOfBytesSent); // 0
27         NSLog(@"所要发送的数据总量 --- %lli", _dataTask.countOfBytesExpectedToSend); // 0
28         
29     }];
30     
31     // 2. 发送请求,执行 task
32     [_dataTask resume];
33     
34 }

365bet体育官网开户, 

个中,24行 —— 27行 中用到的习性,在上一节已经介绍过

专注 : NSUEvoqueLSessionTask 中享有的 task 都亟待 resume 来开端

 

 

  1. POST 请求

设置 “POST央求” 按键的动作方法

 

 1 - (IBAction)POSTButtonClick:(UIButton *)sender {
 2     
 3     // 1. 创建请求对象(可变)
 4     NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:dataURL]];
 5     
 6     // 2. 设置请求方法为 POST 请求
 7     request.HTTPMethod = @"POST";
 8     
 9     request.HTTPBody = [@"type=focus-c" dataUsingEncoding:NSUTF8StringEncoding];
10     
11     // 1. 初始化 NSURLSessionDataTask 对象
12     self.dataTask = [_session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
13         
14         NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
15         
16     }];
17     
18     [_dataTask resume];
19     
20 }

 

2. 代理

运用代理的点子来举办网络诉求,并且能够监察和控制央求进程

以后 mian.storyboard 中拖入一个 UIViewController 并增添控件,如图

365bet体育在线客户端 17

 

本次央求的是一张图纸数据,央浼完现在会将图片显示到显示器上的
UIImageView,resume 按键是开首央求,pause 按键是搁浅须求,cance
按键是撤废供给,中间还会有一个UIProgressView,用于突显央浼的速度,并将那一个控件与插座变量关联

 

UIViewController 中的代码如下,该 ViewController 要服从相关心下一代协会议
<NSU奥迪Q5LSessionDataDelegate>

 

 1 #import "LHDataTaskDownloadViewController.h"
 2 
 3 // 待访问的 URL
 4 static NSString * imageURL = @"http://f12.topit.me/o129/10129120625790e866.jpg";
 5 
 6 @interface LHDataTaskDownloadViewController () <NSURLSessionDataDelegate>
 7 
 8 #pragma mark - 属性列表
 9 #pragma mark 插座变量
10 @property (weak, nonatomic) IBOutlet UIImageView *showImageView;
11 @property (weak, nonatomic) IBOutlet UIProgressView *progressView;
12 @property (weak, nonatomic) IBOutlet UIButton *resumeButton;
13 @property (weak, nonatomic) IBOutlet UIButton *pauseButton;
14 @property (weak, nonatomic) IBOutlet UIButton *cancelButton;
15 
16 #pragma mark 网络对象
17 @property (nonatomic, strong) NSURLSession * session;
18 @property (nonatomic, strong) NSURLSessionDataTask * dataTask;
19 
20 #pragma mark 用于接受数据的对象
21 @property (nonatomic, strong) NSMutableData * data;
22 
23 @end
24 
25 @implementation LHDataTaskDownloadViewController
26 
27 - (void)viewDidLoad {
28     
29     [super viewDidLoad];
30     
31     // 1. 初始化 NSURLSession 对象,delegateQueue 为协议方法运行的线程,传 nil 则在子线程中运行
32     self.session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil];
33     
34     // 2. 初始化 NSURLSessionDataTask 对象,默认为 GET
35     self.dataTask = [_session dataTaskWithURL:[NSURL URLWithString:imageURL]];
36     
37     // 2. 将 cancelButton 和 pauseButton 按钮设置为不可用
38     _cancelButton.enabled = NO;
39     
40     _pauseButton.enabled = NO;
41 
42 }

 

 

发端按键的动作方法

 1 - (IBAction)resumeButtonClick:(id)sender {
 2     
 3     // 1. 判断当前的状态,data task 默认为 暂停状态
 4     if (_dataTask.state == NSURLSessionTaskStateSuspended) {
 5         
 6         _pauseButton.enabled = YES;
 7         
 8         _cancelButton.enabled = YES;
 9     
10         // 1). 开始请求 task
11         [_dataTask resume];
12     
13     }
14     
15 }

 

暂停按键的动作方法

 1 - (IBAction)pauseButtonClick:(id)sender {
 2     
 3     // 1. 判断 task 当前的状态,如果处于正在接受数据的状态,则暂停
 4     if (_dataTask.state == NSURLSessionTaskStateRunning) {
 5     
 6         [_dataTask suspend];
 7     
 8     }
 9     
10 }

 

打消开关的动作方法

 1 - (IBAction)cancelButtonClick:(id)sender {
 2     
 3     // 1. 判断 task 当前的状态,如果处于正在接受数据的状态或暂停状态,则取消
 4     if (_dataTask.state == NSURLSessionTaskStateRunning || _dataTask.state == NSURLSessionTaskStateSuspended) {
 5     
 6         // 1). 取消 task
 7         [_dataTask cancel];
 8         
 9         // 2). 设置滑动条的值
10         _progressView.progress = 0;
11         
12         // 3). 创建对话框VC
13         UIAlertController * alertVC = [UIAlertController alertControllerWithTitle:@"提示" message:@"该 Task 已经被取消" preferredStyle:UIAlertControllerStyleAlert];
14         
15         // 4). 显示对话框VC
16         [self presentViewController:alertVC animated:YES completion:nil];
17         
18         // 5). 创建动作按钮
19         UIAlertAction * cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
20            
21             [self.navigationController popViewControllerAnimated:YES];
22             
23         }];
24         
25         // 6). 将动作按钮添加到对话框VC
26         [alertVC addAction:cancelAction];
27     
28     }
29     
30 }

 

说道格局

#pragma mark 接收到服务器响应时调用,默认情况下不接受数据,所以要允许
// @param session 当前的会话对象
// @param dataTask 当前的 data task 对象
// @param response 响应头对象
// @param completionHandler 回调
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler {

    NSLog(@"%@", NSStringFromSelector(_cmd));

    // 1. 初始化数据对象
    self.data = [[NSMutableData alloc] init];

    // 2. 允许接受数据,如果没有写这句,则后面代理的方法不会被执行
    completionHandler(NSURLSessionResponseAllow);

}

里头,NSUOdysseyLSessionResponseDisposition 是多个枚举

1 typedef NS_ENUM(NSInteger, NSURLSessionResponseDisposition) {
2     NSURLSessionResponseCancel = 0,        // 取消接受数据,之后的代理方法不会被执行,相当于 [task cancel];          
3     NSURLSessionResponseAllow = 1,         // 允许接受数据,之后的代理方法会被执行
4     NSURLSessionResponseBecomeDownload = 2,// 使当前的 data task 变为 download task,当转换为 download task 时,会将数据下载到 tmp 文件中,不需要再接受数据了,并且必须调用下面的 iii) 方法,并且在该方法中可以什么都不写,但必须被调用           
5     NSURLSessionResponseBecomeStream NS_ENUM_AVAILABLE(10_11, 9_0) = 3,// 使当前的 data task 变为 stream task
6 } NS_ENUM_AVAILABLE(NSURLSESSION_AVAILABLE, 7_0);

 

 1 #pragma mark 接受到数据时调用,可能会调用多次
 2 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
 3     
 4     NSLog(@"%@", NSStringFromSelector(_cmd));
 5     
 6     // 1. 拼接收到的数据
 7     [self.data appendData:data];
 8     
 9     // 2. 回到主线程刷新 UI
10     dispatch_async(dispatch_get_main_queue(), ^{
11        
12         _progressView.progress = (float)_dataTask.countOfBytesReceived/_dataTask.countOfBytesExpectedToReceive;
13         
14     });
15     
16 }

 

 1 #pragma mark 请求结束或失败时调用
 2 - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
 3 
 4     NSLog(@"%@", NSStringFromSelector(_cmd));
 5     
 6     UIImage * image = [UIImage imageWithData:_data];
 7     
 8     dispatch_async(dispatch_get_main_queue(), ^{
 9         
10         NSLog(@"currentThread --- %@", [NSThread currentThread]);
11         
12         self.showImageView.image = image;
13         
14     });
15 
16 }

本条点子并不是 NSUENVISIONLSessionTaskDelegate 协议中的方法,适合全数的 task

 

——
NNSURAV4LSessionDataTask,nsurlsessiondatatask 一、基本简单介绍 1.
NSUTiggoLSessionDataTask 是 NSUEnclaveLSessionTask 的子类,是二个切实的
互连网诉求(task) 类,是…

一、基本简介

  1. NSU大切诺基LSessionDataTask 是
    NSUENCORELSessionTask 的子类,是八个具体的 网络央浼(task)
    类,是互连网诉求中最常用的伸手之一

平凡,NSU奥迪Q7LSessionDataTask
用来呼吁数据,能够用来下载数据能源,比如 JSON 数据,图片数据等

 

  1. 普普通通有以下两种情势创造三个 data
    task

1)方法一 :
使用 NSU奥迪Q7LSession 的实例方法

 

1 // @param url 待请求的 URL 地址
2 // @param completionHandler 回调方法
3 // @param data 从服务器请求到的数据
4 // @param response 响应头信息
5 // @param error 错误信息
6 - (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url completionHandler:(void (^)(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;

 

注意 :

该办法中会自动将 url
转变为一个伏乞对象(NSUQashqaiLRequest),并且该乞求对象是 GET 央求形式

回调方法是在子线程中运作的,所以只要在回调方法中刷新
UI 必须再次来到主线程中

回调方法中有两个参数
response / error,那八个参数和 该音信的接受者(即 NSUPAJEROLSessionDataTask
对象)中的 response / error 是指同二个内容,即地址一样

动用该措施的破绽是不能够监听获取数据的进程,因为唯有当全部央浼完数据后,才会调用这几个法子,相当于说,data
中的数据是呼吁的全套数码

 

2)方法二 : 使用 NSU途乐LSession
的实例方法

 

// @param request 请求对象
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;

 

措施二与方法一不等的地点在于 :
方法二能够手动设置央求对象,这样一来,就足以内定央浼情势 GET/POST
中的一个;而艺术一只好是 GET 供给格局

余下的总体等同

 

3)方法三 :
代理

办法一和办法二唯一的弱项正是不能够监督需要进度,因为独有当呼吁完全体的数码后才会调用回调方法,如若想要监察和控制央浼进程,必须运用代理的点子

利用代理第一要自定义 NSU奇骏LSession
对象,使用上面包车型客车措施能够设置代理对象

 

// @param configuration 配置信息对象
// @param delegate 代理对象
// @param queue 代理方法在哪个线程中运行,如果传 nil 则会在子线程中运行代理方法
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration delegate:(nullable id <NSURLSessionDelegate>)delegate delegateQueue:(nullable NSOperationQueue *)queue;

 

再者,必须遵守相关的商谈

再使用上边包车型客车点子创建 data
task,因为那时候下载的进度由代理方法执行,所以不可能用 方法一/方法二 创制data task 对象

- (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url;
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request;

那四个主意的区分和形式一/方法二一致,使用第一个措施个中间会自动将其退换为贰个伏乞对象,何况是 GET 乞求格局;使用办法二能够进行伏乞情势

 

一、基本简要介绍

  1. NSULANDLSessionDataTask 是
    NSUSportageLSessionTask 的子类,是叁个切实的 网络央求(task)
    类,是网络央求中最常用的央浼之一

普通,NSUCR-VLSessionDataTask
用来呼吁数据,能够用来下载数据能源,举个例子 JSON 数据,图片数据等

 

  1. 经常有以下两种格局创建三个 data
    task

1)方法一 :
使用 NSU翼虎LSession 的实例方法

 

1 // @param url 待请求的 URL 地址
2 // @param completionHandler 回调方法
3 // @param data 从服务器请求到的数据
4 // @param response 响应头信息
5 // @param error 错误信息
6 - (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url completionHandler:(void (^)(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;

 

注意 :

该办法中会自动将 url
转变为三个伸手对象(NSUCRUISERLRequest),并且该供给对象是 GET 须求格局

回调方法是在子线程中运维的,所以一旦在回调方法中刷新
UI 必须回到主线程中

回调方法中有四个参数
response / error,那三个参数和 该音讯的接受者(即 NSU奇骏LSessionDataTask
对象)中的 response / error 是指同叁个剧情,即地址同样

应用该办法的症结是无法监听获取数据的快慢,因为只有当整个伸手完数据后,才会调用这么些主意,也正是说,data
中的数据是哀告的全部数目

 

2)方法二 : 使用 NSU奥迪Q5LSession
的实例方法

 

// @param request 请求对象
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;

 

主意二与艺术一比不上的地点在于 :
方法二可以手动设置央求对象,那样一来,就能够钦赐央求形式 GET/POST
中的三个;而艺术一头能是 GET 需要方式

结余的凡事长期以来

 

3)方法三 :
代理

方法一和方法二独一的欠缺便是不能够监察和控制须求进程,因为独有当呼吁完全体的数目后才会调用回调方法,假如想要监察和控制恳求进程,必须利用代理的艺术

行使代理第一要自定义 NSU哈弗LSession
对象,使用上面包车型客车办法能够安装代理对象

 

// @param configuration 配置信息对象
// @param delegate 代理对象
// @param queue 代理方法在哪个线程中运行,如果传 nil 则会在子线程中运行代理方法
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration delegate:(nullable id <NSURLSessionDelegate>)delegate delegateQueue:(nullable NSOperationQueue *)queue;

 

并且,必须信守有关的合计

再使用上面包车型的士不二诀要创设 data
task,因为那时候下载的长河由代理方法施行,所以不可能用 方法一/方法二 创设data task 对象

- (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url;
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request;

那五个艺术的区分和艺术一/方法二一模一样,使用第叁个方法当中间会自动将其改造为三个须要对象,而且是 GET 诉求方式;使用情势二能够进行央求格局

 

出殡 GET 央浼的步骤特别轻巧,只须要两步就足以成功:

一、基本简单介绍

  1. NSU本田CR-VLSessionDataTask 是 NSUENCORELSessionTask 的子类,是贰个现实的
    互连网央浼(task) 类,是网络央浼中最常用的央求之一

万般,NSU陆风X8LSessionDataTask 用来呼吁数据,能够用来下载数据财富,比方 JSON
数据,图片数据等

 

  1. 平时有以下几种方法成立四个 data task

1)方法一 : 使用 NSU传祺LSession 的实例方法

 

1 // @param url 待请求的 URL 地址
2 // @param completionHandler 回调方法
3 // @param data 从服务器请求到的数据
4 // @param response 响应头信息
5 // @param error 错误信息
6 - (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url completionHandler:(void (^)(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;

 

注意 :

该措施中会自动将 url
调换为三个伸手对象(NSUCRUISERLRequest),况且该哀告对象是 GET 诉求格局

回调方法是在子线程中运作的,所以只要在回调方法中刷新 UI 必须重返主线程中

回调方法中有两个参数 response / error,那三个参数和 该音讯的接受者(即
NSURubiconLSessionDataTask 对象)中的 response / error
是指同三个内容,即地址同样

利用该措施的瑕玷是无法监听获取数据的速度,因为唯有当全部呼吁完数据后,才会调用那一个措施,也正是说,data
中的数据是伸手的上上下下数量

 

2)方法二 : 使用 NSUMuranoLSession 的实例方法

 

// @param request 请求对象
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;

 

方法二与措施一两样的地点在于 :
方法二能够手动设置央浼对象,这样一来,就足以钦定乞求情势 GET/POST
中的二个;而艺术贰头可以是 GET 诉求方式

剩余的全数平等

 

3)方法三 : 代理

艺术一和格局二独一的老毛病便是不能够监控供给进程,因为唯有当呼吁完全部的数据后才会调用回调方法,假如想要监察和控制诉求进程,必须使用代理的不二等秘书技

动用代理第一要自定义 NSUPAJEROLSession 对象,使用上面包车型地铁点子能够设置代理对象

 

// @param configuration 配置信息对象
// @param delegate 代理对象
// @param queue 代理方法在哪个线程中运行,如果传 nil 则会在子线程中运行代理方法
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration delegate:(nullable id <NSURLSessionDelegate>)delegate delegateQueue:(nullable NSOperationQueue *)queue;

 

同时,必须遵守有关的协议

 

在行使上面包车型大巴不二法门创制 data task

- (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url;
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request;

那多少个办法的差距和方法一/方法二一致,使用 url
则方法内部会活动将其转移为二个 央浼对象,并且是 GET 供给格局

 

发送 POST 央浼的步骤与发送 GET 央浼同样:

NSUENVISIONLSessionDataTask,能够用来管理一般的互联网诉求,如 GET | POST 央求等

param response 响应头

NSURLSession 的优势

NSU大切诺基LSessionTask 是二个抽象类,借使要利用那么只好使用它的子类

//显著须求路线NSUEvoqueL*url =

[NSURLURLWithString:@”

[NSMutableURLRequestrequestWithURL:url];//修改乞请方法requestM.HTTPMethod=@”POST”;//设置乞求体requestM.HTTPBody=
[@”username=520&pwd=520&type=JSON”dataUsingEncoding:NSUTF8StringEncoding];//创造会话对象NSU猎豹CS6LSession*session
= [NSURLSessionsharedSession];//创设诉求TaskNSU奇骏LSessionDataTask*dataTask = [session
dataTaskWithRequest:requestM completionHandler:            ^(NSData*
_Nullable data,NSURLResponse* _Nullable response,NSError* _Nullable
error) {//分析重回的数目NSLog(@”%@”, [[NSStringalloc]
initWithData:data encoding:NSUTF8StringEncoding]);
}];//发送供给[dataTask resume];

NSU昂科威LSessionDataTask
设置代理发送需要

成立 NSU昂科拉LSession 对象设置代理

行使 NSU普拉多LSession 对象创设 Task

执行 Task

//鲜明乞求路线NSU途达L*url =

param data    再次来到的数量(响应体)

NSURLSessionTask 的子类

NSURLSession 的优势

发表评论

电子邮件地址不会被公开。 必填项已用*标注