本文共 5615 字,大约阅读时间需要 18 分钟。
1.创建NSURLSession的会话
2.根据会话创建Task 3.执行TaskTask的类型
NSURLSessionTask是一个抽象类,我们无法直接运用到它,运用到的是它的三个子类。如何获取NSURLSession?
1.获得共享的Session +(NSURLSession*)sharedSession; 2.自定义的Session +(NSURLSession*)sessionWithConfiguration:(NSURLSessionConfiguration )configuration delegate:(id< NSURLSessionDelegate >)delegate delegateQueue:(NSOperationQueue)queue; 需要传入配置信息,设置代理。NSURLSessionTask
-(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请求地址,后面不能直接跟要向服务器传的参数的,只需要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];}
- (void)touchesBegan:(NSSet*)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); }}
转载地址:http://xpwin.baihongyu.com/