美文网首页程序员
iOS 开发-NSURLSession设置代理NSURLSess

iOS 开发-NSURLSession设置代理NSURLSess

作者: 037e3257fa3b | 来源:发表于2017-02-23 18:35 被阅读0次

    方法截图:


    NSURLSession.png

    上一篇我们说到,一般情况下我们都直接使用下面的那两个带有block回调的方法来发起网络请求。然而,我们获取不了数据的进度,这时就需要我们采用代理。

    以GET方法为例,设置代理

    #import "ViewController.h"
    
    @interface ViewController ()<NSURLSessionDataDelegate>
    /** 接受响应体信息 */
    @property (nonatomic, strong) NSMutableData *fileData;
    @end
    
    @implementation ViewController
    
    -(NSMutableData *)fileData
    {
        if (_fileData == nil) {
            _fileData = [NSMutableData data];
        }
        return _fileData;
    }
    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
    {
        //1.url
        NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=123&pwd=123&type=JSON"];
        
        //2.创建请求对象
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        
        //3.创建会话对象,设置代理
        /*
         第一个参数:配置信息 [NSURLSessionConfiguration defaultSessionConfiguration]
         第二个参数:代理
         第三个参数:设置代理方法在哪个线程中调用
         */
        NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
        
        //4.创建Task
        NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request];
        
        //5.执行Task
        [dataTask resume];
    }
    
    #pragma mark ----------------------
    #pragma mark NSURLSessionDataDelegate
    /**
     *  1.接收到服务器的响应 它默认会取消该请求
     *
     *  @param session           会话对象
     *  @param dataTask          请求任务
     *  @param response          响应头信息
     *  @param completionHandler 回调 传给系统
     */
    -(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
    {
        NSLog(@"%s",__func__);
        
        /*
         NSURLSessionResponseCancel = 0,取消 默认
         NSURLSessionResponseAllow = 1, 接收
         NSURLSessionResponseBecomeDownload = 2, 变成下载任务
         NSURLSessionResponseBecomeStream        变成流
         */
    // 这里的block是传给服务端的,如若不写则代表取消网络请求。
        completionHandler(NSURLSessionResponseAllow);
    }
    
    /**
     *  接收到服务器返回的数据 调用多次
     *
     *  @param session           会话对象
     *  @param dataTask          请求任务
     *  @param data              本次下载的数据
     */
    -(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
    {
         NSLog(@"%s",__func__);
        
        //拼接数据
        [self.fileData appendData:data];
    }
    
    /**
     *  请求结束或者是失败的时候调用
     *
     *  @param session           会话对象
     *  @param dataTask          请求任务
     *  @param error             错误信息
     */
    -(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
    {
         NSLog(@"%s",__func__);
        
        //解析数据
        NSLog(@"%@",[[NSString alloc]initWithData:self.fileData encoding:NSUTF8StringEncoding]);
    }
    
    
    @end
    
    

    相关文章

      网友评论

        本文标题:iOS 开发-NSURLSession设置代理NSURLSess

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