IOS开发记录之NSURLSession的使用。
背景:
在IOS9之后苹果开始弃用NSURLConnetion来进行网络请求,而是使用NSURLSession进行网络请求的相关操作。
介绍:
NSURLSession下面包含两个子类NSURLSessionTask和NSURLSessionDownloadTask。
本文主要讲NSURLSessionTask的使用。
使用NSURLSessionTask进行GET请求:
方法一 不需要对请求过程进行监控:
NSURL *url=[NSURL URLWithString:@"http://115.28.26.84:8091/getServerTxt.aspx?path=PointInfo.txt"]; //发起一个NSURLRequest,或者直接在NSURLSessionTask可以用dataTaskWithURL方法 NSURLRequest *request=[NSURLRequest requestWithURL:url]; //开启一个NSURLSession,用静态方法sharedSession //该类使用共享的会话,该会话使用全局的Cache,Cookie和证书 NSURLSession *session=[NSURLSession sharedSession]; //因为不许对网络请求的过程进行监控,所以直接在一个block回调中进行,而不需要执行相应的代理方法 //生成一个NSURLSessionTask,该方法有3个返回值 //response表示网络请求有响应,data是请求的数据,error是网络请求出错误是返回的错误结果 NSURLSessionTask *task=[session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (!error) { NSDictionary *dic=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; NSLog(@"%@",dic); } else NSLog(@"%@",error); }]; [task resume]; }
有时候我们需要对请求的过程进行监视,比如说我们用MBProgressHUD来使用户清楚的看到请求正在进行。那么就需要将请求的过程拆解开来,这是就要是用
NSURLSessionTask的代理方法
方法二:
-(void)requestData{ [MBProgressHUD showHUDAddedTo:self.view animated:YES]; NSURL *url=[NSURL URLWithString:@"http://115.28.26.84:8091/getServerTxt.aspx?path=PointInfo.txt"]; //发起一个NSURLRequest,或者直接在NSURLSessionTask可以用dataTaskWithURL方法 NSURLRequest *request=[NSURLRequest requestWithURL:url]; //session的代理方法需要Configuration,代理对象设为本身 //其中session要设置执行的线程,可以新生成一个线程 //此处因为需要涉及给用户界面的相应,放在主线程中进行 //一般来说有界面响应的操作最好都放在主线程中进行 NSURLSession *session=[NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]]; //因为使用代理方法,所以网络请求中的操作放在代理方法中进行,这里只需要生成一个task; NSURLSessionTask *task=[session dataTaskWithRequest:request]; [task resume]; } #pragma mark NSURLSessionTaskDelegate //在网络发起请求后首先会执行didReceiveResponse,表示请求成功,得到了服务器的相应 //需要允许处理响应才能继续接受数据 -(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{ if (!self.data) { self.data=[NSMutableData new]; } completionHandler(NSURLSessionResponseAllow); } //在收到处理响应的许可后,开始获取数据 -(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{ [self.data appendData:data]; } //在请求完成后 -(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{ if (!error) { _Arr=[NSJSONSerialization JSONObjectWithData:self.data options:NSJSONReadingMutableLeaves error:nil]; _DisplayArr=[NSMutableArray arrayWithArray:_Arr]; [self.HomeTable reloadData]; [MBProgressHUD hideHUDForView:self.view animated:YES ]; } else NSLog(@"%@",error); }
使用NSURLSessionTask进行POST请求:
NSURL *url=[NSURL URLWithString:@"http://115.28.26.84:8095/PersonalPage/login.aspx?"]; //发起一个NSMutableURLRequest,request的默认请求是GET请求 NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url]; //设置请求方式为POST请求 request.HTTPMethod=@"POST"; //设置请求体 request.HTTPBody=[@"userid=cww&psd=123" dataUsingEncoding:NSUTF8StringEncoding]; //创建一个网络对话 NSURLSession *session=[NSURLSession sharedSession]; //发起一个网络任务 NSURLSessionTask *task=[session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (!error) { NSDictionary *dic=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; } else NSLog(@"%@",error); }]; [task resume];
如果需要对请求过程进行监控同样可以使用代理方法。