iOS开发代码段程序员iOS技术专题

iOS网络通信-->NSURLSession

2016-04-08  本文已影响281人  大侠走一波

NSURLSession,是在iOS7.0之后,Apple推出用来替代NSURLConnection的系统类。我们可以使用NSURLSession很容易的处理网络通信中的两种请求方法GET和POST,有关这两种请求方法的区别,感兴趣的戳这里 ⬇️
http://www.w3school.com.cn/tags/html_ref_httpmethods.asp

在NSURLSession 中,我们可以实现GET和POST两种请求方式,而每一种请求方式,都可以用两种手段来实现 block方式和协议代理的方式,采用block方式特点是简单,只需一个方法,在其后面的block回调中,就可以拿到我们请求的数据,而使用delegate的方式,可以使我们精确操控每一步,从 server响应连接--> client开始接收数据 -->client请求数据完成,每一步里,我们都可以实现一些额外的功能方法。

在这里只是简单粗暴的展示使用方法,可以快速的完成功能需求,不涉及细节研究。下面会出现几个概念,简单说一下

NSURLSession 是整个工具类的一个对象
NSURLSessionDataTask 继承自NSURLSessionTask,指明你的任务类型

1.GET 请求(block方式获得数据)
   //通过单例得到session对象 (好多工具类,我们在整个app中只需要一个,所以就经常使用单例这种设计模式)
   NSURLSession *session = [NSURLSession sharedSession];
   //url对象
   NSURL *url = [NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"];
   //建立任务 在这里我们选择的是通过URL初始化一个task对象
   NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
       //block参数中的data对象,就是我们所需要的数据,在block中,我们就可以按照自己的需求使用数据
       NSString *resultStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
       NSLog(@"----%@",resultStr);
   }];
   //启动任务      这一步很关键哦,不要看它短
   [dataTask resume];
}

是不是很简单?

2.POST请求 (block方式)

和GET请求的方式差不多,GET请求的参数(数据),是拼接在url地址后面,而到了POST请求,我们把参数(数据),塞在POST请求的body内,所以我们就需要NSMutableURLRequest对象,设置该对象,并且使用该对象作为参数,初始化我们的task任务

- (void)sessionPost{
    //得到session对象
    NSURLSession *session = [NSURLSession sharedSession];
    //得到url
    NSURL *url = [NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx"];
    //创建请求对象   使用可变对象 Mutable 啊
    NSMutableURLRequest *mRequest = [[NSMutableURLRequest alloc] initWithURL:url];
    //设置请求方式 我们声明这是一个POST请求
    [mRequest setHTTPMethod:@"POST"];
    //组装数据 参数,其实就是我们的数据
    NSString *pStr = @"date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
    NSData *pData = [pStr dataUsingEncoding:NSUTF8StringEncoding];
    //添加数据 塞进肚子里
    [mRequest setHTTPBody:pData];
    //创建Datatask任务
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:mRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        //处理数据
        NSString *resultStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"%@",resultStr);
    }];
    //启动任务
    [dataTask resume];
}
3.GET请求 (delegate 协议代理方式)

在上面的两种请求方式中,我们都使用单例得到NSURLSession对象,而在delegate模式下,我们使用的是便利构造器的方式

- (void)sessionDelegate{
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc] init]];
     //下面使用的是NSURLRequest ,我们也可以使用NSMutableURLRequest进行POST请求
    NSURLSessionDataTask *task = [session dataTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"]]];
    
    [task resume];
}

服务器开始响应,准备返回数据 ,在此方法里面我们可以初始化我们的数据接收容器

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{
    completionHandler(NSURLSessionResponseAllow);
    
    //当网络请求是基于http协议时,response的本质是NSHTTPURLResponse类型
    NSHTTPURLResponse *heepResponse = (NSHTTPURLResponse *)response;
    //打印状态码  200 、404 之类的
    NSLog(@"%ld",heepResponse.statusCode);
    //接收容器是可变类型的
    self.mData = [[NSMutableData alloc] init];
    
}

客户端接收数据 ,此方法会多次执行,所以我们需要可变容器来接收,一个劲的往后拼接新数据

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{
    [self.mData appendData:data];
}

数据请求完成,网络请求成功

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{
    NSString *result = [[NSString alloc] initWithData:self.mData encoding:NSUTF8StringEncoding];
    NSLog(@"%@",result);
}

这就是我们使用系统的NSURLSession进行网络通信的方法,而目前有好多人使用第三方AFNetworking,其实也就是对NSURLSession进行了封装,Ps:AFNetworking在iOS7.0之前,应该是封装的NSURLConnection,在iOS7.0之后,也跟随了Apple的步伐 ,做出了更新。

上一篇下一篇

猜你喜欢

热点阅读