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];

如果需要对请求过程进行监控同样可以使用代理方法。

posted on 2016-03-30 22:11  冰河葬寒心  阅读(269)  评论(0)    收藏  举报