优点:
后台上传和下载:
只需在创建NSURLSession的时候配置一个选项,就能得到后台网络的所有好处。这样可以延长电池寿命,并且还支持UIKit的多task,在进程间使用相同的委托模型。-
能够暂停和恢复网络操作:
使用NSURLSession API能够暂停,停止,恢复所有的网络任务,再也完全不需要子类化NSOperation.
-
可配置的容器:
对于NSURLSession里面的requests来说,每个NSURLSession都是可配置的容器。举个例来说,假如你需要设置HTTP
header选项,你只用做一次,session里面的每个request就会有同样的配置。
-
提高认证处理:
认证是在一个指定的连接基础上完成的。在使用NSURLConnection时,如果发出一个访问,会返回一个任意的request。此时,你就不能确切的知道哪个request收到了访问。而在NSURLSession中,就能用代理处理认证。
-
丰富的代理模式:
在处理认证的时候,NSURLConnection有一些基于异步的block方法,但是它的代理方法就不能处理认证,不管请求是成功或是失败。在NSURLSession中,可以混合使用代理和block方法处理认证。
-
上传和下载通过文件系统:
它鼓励将数据(文件内容)从元数据(URL和settings)中分离出来。
使用案例:
// 1、创建URL资源地址
NSURL *url = [NSURL URLWithString:Post_Url_String];
// 2、创建Reuest请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 3、配置Request
request.timeoutInterval = 10.0;
request.HTTPMethod = @"POST";
// 4、构造请求参数
// 4.1、创建字典参数,将参数放入字典中,可防止程序员在主观意识上犯错误,即参数写错。
NSDictionary *parametersDict = @{@"id":Post_Url_Parameter_Id, @"key":Post_Url_Apikey, @"dtype":Post_Url_Parameter_Dtype};
// 4.2、遍历字典,以“key=value&”的方式创建参数字符串。
NSMutableString *parameterString = [NSMutableString string];
for (NSString *key in parametersDict.allKeys) {
// 拼接字符串
[parameterString appendFormat:@"%@=%@&", key, parametersDict[key]];
}
// 4.3、截取参数字符串,去掉最后一个“&”,并且将其转成NSData数据类型。
NSData *parametersData = [[parameterString substringToIndex:parameterString.length - 1] dataUsingEncoding:NSUTF8StringEncoding];
// 5、设置请求报文
request.HTTPBody = parametersData;
// 6、构造NSURLSessionConfiguration
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
// 7、创建网络会话
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];
// 8、创建会话任务
NSURLSessionTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
// 10、判断是否请求成功
if (error) {
NSLOG(error.localizedDescription);
}else {
// 如果请求成功,则解析数据。
id object = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];
// 11、判断是否解析成功
if (error) {
NSLOG(error.localizedDescription);
}else {
// 解析成功,处理数据,通过GCD获取主队列,在主线程中刷新界面。
NSLOG(object);
dispatch_async(dispatch_get_main_queue(), ^{
// 刷新界面...
});
}
}
}];
// 9、执行任务
[task resume];