iOS网络通信-->NSURLSession

作者: 大侠走一波 | 来源:发表于2016-04-08 22:46 被阅读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的步伐 ,做出了更新。

    相关文章

      网友评论

        本文标题:iOS网络通信-->NSURLSession

        本文链接:https://www.haomeiwen.com/subject/iswvlttx.html