美文网首页
NSURLSession (一) 采用协议方法回调

NSURLSession (一) 采用协议方法回调

作者: 努力奔跑的小男孩 | 来源:发表于2016-11-23 19:50 被阅读566次

    这一篇记录的是iOS开发中关于 NSURLSession 的使用方法,其使用方法主要有采用协议方法采用Block方法.这篇主要介绍采用协议方法.采用Block 实现方法将在不久进行更新.

    URL:网络请求的目标路径
    http://10.0.8.8:8080/sns/my/user_list.php?format=json&page=1&number=20
    http:// 表示请求要遵循的网络传输协议 是HTTP协议
    IP地址/主机名/域名   10.0.8.8
    端口 : 8080(默认的)
    资源路径:/sns/my/user_list.php
    资源参数:?format=json&page=1&number=20
    
    设置请求的缓存机制
      NSURLRequestUseProtocolCachePolicy = 0,//协议缓存
      NSURLRequestReloadIgnoringLocalCacheData = 1,//忽略本地缓存
      NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4 //忽略本地和远程的缓存,直接发起请求
      NSURLRequestReloadIgnoringCacheData =           NSURLRequestReloadIgnoringLocalCacheData,//忽略缓存
      NSURLRequestReturnCacheDataElseLoad = 2,//优先使用缓存数据,如果没有再去网络请求
      NSURLRequestReturnCacheDataDontLoad = 3,//使用缓存数据,永不下载,主要用于本地数据缓存处理
      NSURLRequestReloadRevalidatingCacheData = 5,//优先使用有效的缓存数据,如果失效再去请求新的数据
    
    URLSession 三种工作模式
    1. 默认模式: 和NSURLConnection 类似的工作方式, 依然采用硬盘作为请求的缓存机制, 将请求的缓存数据和用户信息存放在钥匙串中
    2. 瞬时会话模式: 系统将网络请求的缓存数据和用户信息存储在RAM(寄存器中),一旦session 失效, 退出APP之后,将不再保留这些缓存数据, 用于临时会话
    3. 后台工作模式: 用于支持APP处于非活跃状态的一些后台任务处理  
    创建session 配置(NSURLSessionConfiguration)
    [NSURLSessionConfiguration defaultSessionConfiguration];   默认模式
    [NSURLSessionConfiguration ephemeralSessionConfiguration] 临时会话模式, 配置创建
    [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"identify"]; 后台模式配置创建
    
    URLSession 三种任务模式
    1. NSURLSessionDataTask 普通的数据请求任务
    2. NSURLSessionUploadTask 数据上传任务
    3. NSURLSessionDownloadTask  数据下载任务
    
    NSHTTPURLResponse的StatusCode
    200 表示请求成功 可以正常处理
    40X
    400 表示参数错误,注意监测自己的资源参数部分
    404 注意监测自己的 IP 地址写错; 如果IP地址没有错误,服务器端人员检查服务器的运行情况
    50X 服务器异常
    30X
    302 303/304 :公司当中的接口有重定向的情况才会出现; 重定向指一次请求没法完成服务器处理时,需要重定向请求的操作
    

    总结

    一次HTTP网络请求的过程
    1. 建立连接(通过三次握手完成)
    a.由客户端(Client)发起第一次握手(报文)请求,告诉服务器(Server)准备处理请求
    b.服务器(Server)接收到客户端(Client)的报文之后,准备处理链接请求并且会为这次链接分配资源,向客户端(Client) 发送确认报文(第二次握手)
    c.客户端(Client) 接收到服务器(Server)的确认报文之后, 根据状态吗判断是否能够建立链接, 200 成功, 发送确认连接报文(第三次握手)
    
    2. 进入数据传输阶段
    
    3. 断开连接阶段(四次挥手)
    例: 客户端(Client)先传输完毕
    a.数据传输完毕之后,客户端(Client) 发起断开请求, 向服务器(Server)发送一个FIN(报文), 告诉服务器(Server)数据传输完毕,准备断开连接
    b.服务器(Server)接收到客户端(Client) 的断开请求时, 向客户端(Client) 发送一个确认信息(ACK),告诉客户端(Client) 我(Server)已经收到你的断开请求,你(Client)可以进入等待断开连接状态
    c.服务器(Server)数据传输结束之后, 向客户端(Client)发起一个断开请求FIN, 告诉客户端(Client), 我也传输完毕,准备断开
    d.客户端(Client) 接受到Server 发送的FIN 之后, 确认可以断开了(等待断开状态), 向服务器(Server)发起一个ACK,确认可以断开了,服务器(Server)关闭连接
    
    参考资料

    TCP三次握手和四次挥手协议
    TCP/IP四层模型和OSI七层模型的概念

    核心代码
    需要遵循<NSURLSessionDelegate>协议
    @interface ViewController () <NSURLSessionDataDelegate>
    @property (nonatomic, strong) NSMutableData * data; //用于接受服务器端相应的数据
    @end
    
    // 需要实现的方法(在viewDidLoad 里直接调用)
    // URLSession 网络请求, 采用协议方法回调
    - (void)sessionWithDelegate{
        // 用session 发起一个网络请求
        // URL: 网络请求的目标路径
        // http://10.0.8.8/sns/my/user_list.php?format=json&page=1&number=20
        // http:// 表示请求要遵循的网络传输协议, 是HTTP协议
        // 10.0.8.8 表示IP地址/ 主机名 / 域名
        // 端口: 8080(默认的)
        // 资源路径:/sns/my/user_list.php
        // 资源参数:?format=json&page=1&number=20
    
        NSString * urlStr = @"http://10.0.8.8/sns/my/user_list.php?format=json&page=1&number=20";
        // 创建NSURL 对象
        NSURL * url = [NSURL URLWithString:urlStr];
    
        // 创建NSMutableURLRequest 请求对象 它是继承于 NSURLRequest
        // 真正的请求发起者
        NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];
    
        // 设置请求方式  GET(查询)、POST(增加)、PUT(修改)、DELETE(删除)、TRACE、HEAD、OPTION 常用的是前 4 个
        request.HTTPMethod = @"GET";
        // 设置最长失效时间 (单位 是秒) 如果10s 还没有收到服务器的response 的消息,就请求超时
        request.timeoutInterval = 10;
        // 设置请求的缓存机制
        [request setCachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData];
        /*
         NSURLRequestUseProtocolCachePolicy = 0, 协议缓存
    
         NSURLRequestReloadIgnoringLocalCacheData = 1,  // 忽略本地缓存
         NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, // Unimplemented // 忽略本地和远程的缓存,直接发起请求  (推荐使用)
         NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData, // 忽略缓存
    
         NSURLRequestReturnCacheDataElseLoad = 2, // 优先使用缓存数据, 如果没有再去发起网络请求
         NSURLRequestReturnCacheDataDontLoad = 3, // 使用缓存数据, 永不下载 (主要本地数据处理)
    
         NSURLRequestReloadRevalidatingCacheData = 5, // Unimplemented 优先使用有效的缓存数据, 如果失效,再去请求数据
         */
    
    
    
        /*
         session 三种工作模型 
         1. 默认模式: 和NSURLConnection 类似的工作方式, 依然采用硬盘作为请求的缓存机制, 将请求的缓存数据和用户信息存放在钥匙串中
         2. 瞬时会话模式: 系统将网络请求的缓存数据和用户信息存储在RAM(寄存器中),一旦session 失效, 退出APP之后,将不再保留这些缓存数据, 用于临时会话
         3. 后台工作模式: 用于支持APP处于非活跃状态的一些后台任务处理
         */
    
        /*
            创建session 配置
            [NSURLSessionConfiguration defaultSessionConfiguration];   默认模式
            [NSURLSessionConfiguration ephemeralSessionConfiguration] 临时会话模式, 配置创建
            [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"identify"]; 后台模式配置创建
         */
        //1.默认模式
        NSURLSessionConfiguration * configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    
    
        //临时会话模式, 配置创建
        [NSURLSessionConfiguration ephemeralSessionConfiguration];
        // 后台模式配置
        [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"identify"];
    
        // 创建管理线程执行的队列
    
        NSOperationQueue * queue = [[NSOperationQueue alloc]init];
    
        // 创建session 对象, 并设置为默认工作模式
        NSURLSession * session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:queue];
        // 发情请求,需要借助任务 -> 创建任务
        /*
            1. NSURLSessionDataTask 普通的数据请求任务
            2. NSURLSessionUploadTask 数据上传任务
            3. NSURLSessionDownloadTask  数据下载任务
         */
        NSURLSessionDataTask * dataTask = [session dataTaskWithRequest:request];
        // 启动任务
        [dataTask resume]; // 发起请求, 第一次握手发起
        //HTTP:面向连接的超文本传输文本, 是应用层网络协议,传输数据之前需要建立连接,通过三次握手建立连接
    }
    
    需要实现<NSURLSessionDelegate>代理方法
    //当接收到服务器端的响应时的回调方法(response 第二次握手)
    -(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
    {
        //将接收到的响应,转换为针对HTTP的响应
        NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;
        //根据响应的状态码判断服务器是否能接收连接,处理你的请求
        if(res.statusCode == 200){
            /**
             statusCode:
             200 表示请求成功,可以正常处理
             40X 400 表示参数错误,注意检测的资源参数部分,404 注意检测自己的IP地址是否写错,如果IP地址没有错误,服务器端人员检查服务的运行情况
             50X:服务端异常
             30X: 302  303/304 : 公司中的接口有需要重定向的情况,才会出现;重定向指一次请求没法完成服务处理时,需要重新定向请求的操作
             */
            
            //开辟存储响应数据的空间
            _data = [[NSMutableData alloc]init];
            
            //运行请求操作继续,第三次握手发起
            completionHandler(NSURLSessionResponseAllow);
        }
        NSLog(@"接收到服务器端的响应,让请求继续");
        
    }
    //接收到服务器端传输的数据时的回调方法
    -(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
    {
        //按顺序拼接服务器传输的数据:数据一般分多次返回,每次返回的数据量跟当前的网络状态、和 服务器当前正在处理的请求个数有个
        [_data appendData:data];
        NSLog(@"接收到传输数据");
    }
    //网络请求结束
    -(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
    {
        if(error == nil){
            
            NSLog(@"网络请求处理成功");
            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:_data options:NSJSONReadingMutableContainers error:nil];
            NSLog(@"获取的网络数据:%@",dict);
        }else{
            NSLog(@"网络请求处理失败");
    
        }
        
    }
    //重定向(没有实现)
    -(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task willPerformHTTPRedirection:(NSHTTPURLResponse *)response newRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLRequest * _Nullable))completionHandler
    {
        //如果response的 statusCode 是 30X 的情况才写这个方法
        //中途增加访问的的服务器
        //需要新的目标路径
        NSURL * url = [NSURL URLWithString:@"http://api.izhangchu.com/?methodName=HomeIndex"];
        NSURLRequest *req = [NSURLRequest requestWithURL:url];
        NSLog(@"发起重定向请求");
        //发起重定向请求
        completionHandler(req);
    }
    

    相关文章

      网友评论

          本文标题:NSURLSession (一) 采用协议方法回调

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