网络编程(二)NSURLSessionConfiguration

1.NSURLSession有三种工作模式

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

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

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

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

下面上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- (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>协议

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#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 @ 2016-02-26 16:06  罗小浮  阅读(271)  评论(0编辑  收藏  举报