使用步骤
1.创建NSURLSession的会话
2.根据会话创建Task
3.执行Task
Task的类型
NSURLSessionTask是一个抽象类,我们无法直接运用到它,运用到的是它的三个子类。
如何获取NSURLSession?
1.获得共享的Session
+(NSURLSession*)sharedSession;
2.自定义的Session
+(NSURLSession*)sessionWithConfiguration:(NSURLSessionConfiguration )configuration delegate:(id< NSURLSessionDelegate >)delegate delegateQueue:(NSOperationQueue)queue;
需要传入配置信息,设置代理。
NSURLSessionTask
- 常见方法
-(void)suspend;//暂停
-(void)resume;//恢复
-(void)cancel;//取消
-(void)cancelByProducingResumeData:(void(^)(NSData*resumeData))completionHandler;//取消任务
GET
-(void)dataTask{
//设置请求地址,GET请求,直接把请求参数跟在URL的后面以?隔开,多个参数之间以&符号拼接
NSURL *url=[NSURL URLWithString:LIST_URL];
//封装一个请求类
NSURLRequest *request =[NSURLRequest requestWithURL:url];
//1.创建Session
NSURLSession *session=[NSURLSession sharedSession];
//2.根据会话创建任务
NSURLSessionDataTask *dataTask= [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//在子线程中执行的
NSLog(@"----%@----",[NSThread currentThread]);
if(error==nil){
id objc=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%@",objc);
}
//回归主线程,如果要做UI的操作,必须回到主线程
//[self performSelectorOnMainThread:<#(nonnull SEL)#> withObject:<#(nullable id)#> waitUntilDone:(BOOL)];
// [dispatch_async(dispatch_get_main_queue(), <#^(void)block#>)]
//[NSOperationQueue mainQueue] addOperationWithBlock:<#^(void)block#>
}];
//3.启动任务
[dataTask resume];
}
函数说明:
NSURLSessionDataTask *dataTask= [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)
request:传的请求;completionHandler:请求之后给咱们回调回来的信息;data:服务器回来的响应体;response:响应头;error:发送请求遇到的错误。
id objc=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
数据data是JSON数据,解析JSON数据。如果不知道解析出来的是什么数据类型,可以用id 数据类型接受。
回到主线程:
//回归主线程的三种方法
//[self performSelectorOnMainThread:<#(nonnull SEL)#> withObject:<#(nullable id)#> waitUntilDone:(BOOL)];
// [dispatch_async(dispatch_get_main_queue(), <#^(void)block#>)]
//[NSOperationQueue mainQueue] addOperationWithBlock:<#^(void)block#>
}];
POST
POST请求地址,后面不能直接跟要向服务器传的参数的,只需要URL获得服务器地址。
因为要对请求作修改:所以用NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];
设置方式;
设置请求体;
-(void)post{
//设置请求地址,后面不能跟给服务器传的参数的,只需要获得服务器地址
NSURL *url=[NSURL URLWithString:@"http://new.api.bandu.cn/book/listofgrade"];
NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];
//设置请求方式
request.HTTPMethod=@"POST";
//设置请求体
request.HTTPBody=[@"grade_id=2" dataUsingEncoding:NSUTF8StringEncoding];
//1.创建Session
NSURLSession *session=[NSURLSession sharedSession];
//2.根据会话创建任务
NSURLSessionDataTask *dataTask= [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//在子线程中执行的
NSLog(@"----%@----",[NSThread currentThread]);
if(error==nil){
id objc=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%@",objc);
}
//回归主线程,如果要做UI的操作,必须回到主线程
//[self performSelectorOnMainThread:<#(nonnull SEL)#> withObject:<#(nullable id)#> waitUntilDone:(BOOL)];
// [dispatch_async(dispatch_get_main_queue(), <#^(void)block#>)]
//[NSOperationQueue mainQueue] addOperationWithBlock:<#^(void)block#>
}];
//3.启动任务
[dataTask resume];
}
DataTask代理方法
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//1.创建请求地址
NSURL *url=[NSURL URLWithString:LIST_URL];
//2.创建请求类
NSURLRequest *request=[NSURLRequest requestWithURL:url];
//3.创建会话
/**
配置:
defaultSessionConfiguration;//默认的,使用的时候NSURLSession就相当于NSURLConnection
ephemeralSessionConfiguration;//无痕浏览,不存储任何信息
backgroundSessionConfigurationWithIdentifier;后台下载,应用程序如果退出到后台,还想下载,并且下载完后还想通知你。
*/
/*
delegateQueue 表示协议方法在哪个线程中执行。
*/
NSURLSession *session=[NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
//4.根据会话创建任务
NSURLSessionDataTask *dataTask=[session dataTaskWithRequest:request];
//5.启动任务
[dataTask resume];
}
代理方法:
//接受服务器的响应
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{
NSLog(@"didReceiveResponse");
if(self.data==nil){
self.data=[[NSMutableData alloc]init];
}else{
self.data.length=0;
}
/*
SURLSessionResponseCancel = 0, 默认 请求之后不接收服务器的数据
NSURLSessionResponseAllow = 1,允许接受服务器的数据
NSURLSessionResponseBecomeDownload = 2,转成下载任务
NSURLSessionResponseBecomeStream,转成流
*/
completionHandler(NSURLSessionResponseAllow);
}
//接受到数据,该方法会被调用多次
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{
NSLog(@"didReceiveData");
//拼接数据
[self.data appendData:data];
}
//数据请求完成,或者请求出现错误调用的方法
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{
NSLog(@"didCompleteWithError");
if(error==nil){
id objc=[NSJSONSerialization JSONObjectWithData:self.data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"-%@",objc);
}
}