网络编程(二)NSURLSessionConfiguration

1.NSURLSession有三种工作模式

(1)defaultSessionConfiguration(默认):使用的是基于磁盘缓存的持久化策略,Cache,Cookie。

(2)ephemeralSessionConfiguration(短暂):该模式不使用磁盘保存任何数据。所有和会话相关的caches,证书,cookies等都被保存在RAM中,因此当程序使会话无效,这些缓存的数据就会被自动清空。

(3)backgroundSessionConfigurationWithIdentifier:(NSString *)identifier(后台):在后台完成上传和下载,在创建Configuration对象的时候需要提供一个NSString类型的标识。

 我们可以设置NSURLSessionConfiguration的相关属性来对NSURLSession进行配置,如果不对NSURLSession进行配置,采用默认的工作模式。

下面上代码:

- (void)configSession
{
    //1.构造URL
    NSURL *url = [NSURL URLWithString:@"http://news-at.zhihu.com/api/3/news/latest"];
    //2.配置NSURLSessionConfiguration
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    //允许使用蜂窝网络
    config.allowsCellularAccess = YES;
    //设置超时时间(秒)
    config.timeoutIntervalForRequest = 10;
    
    //3.创建session对象时使用config进行配置
    NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    //4.创建网络任务
    NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url];
    //5.发送网络请求
    [dataTask resume];
    
}

 发送网络请求后要在代理里面进行相关操作

这里代理遵守的协议有很多种可以选择,根据网络任务(Task)的不同遵守不同的协议,本例遵守<NSURLSessionDataDelegate>协议

#pragma mark - NSURLSessionDataDelegate 

//监听网络传输完成的事件
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didCompleteWithError:(nullable NSError *)error {
    
    NSLog(@"网络传输完成");
    
}

//收到了响应包中的状态码以及响应头数据,只会被调用一次
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler {
    
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
    
    NSLog(@"响应状态码:%ld", httpResponse.statusCode);
    
    //NSURLSessionResponseAllow:继续传输响应体数据
    //NSURLSessionResponseCancel:取消当前传输,相当于task cancel
    completionHandler(NSURLSessionResponseAllow);
    
}

//收到响应体的数据--此方法可能会被调用多次
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
    
    //如果要获取到完整的数据要创建一个全局的NSMutableData对每次接收到的data进行拼接
    NSLog(@"每次接收到数据包的长度:%li", data.length);
    
}

 

posted on 2016-01-28 21:59  利利利  阅读(573)  评论(0编辑  收藏  举报

导航