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 //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); } |