Core Foundation中NSURLConnection在2003年伴随着Safari浏览器的发行,诞生的时间比较久远,iOS升级比较快,AFNetWorking在3.0版本删除了所有基于NSURLConnection API的所有支持,新的API完全基于NSURLSession。AFNetworking 1.0建立在NSURLConnection的基础之上 ,AFNetworking 2.0使用NSURLConnection基础API,以及较新基于NSURLSession的API的选项。NSURLSession用于请求数据,作为URL加载系统,支持http,https,ftp,file,data协议。
基础知识
URL加载系统中需要用到的基础类:
iOS7和Mac OS X 10.9之后通过NSURLSession加载数据,调用起来也很方便:
1
2
3
4
5
6
7
8
|
NSURL *url=[NSURL URLWithString: @"http://www.cnblogs.com/xiaofeixiang" ];
NSURLRequest *urlRequest=[NSURLRequest requestWithURL:url]; NSURLSession *urlSession=[NSURLSession sharedSession]; NSURLSessionDataTask *dataTask=[urlSession dataTaskWithRequest:urlRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { NSDictionary *content = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog( @"%@" ,content);
}]; [dataTask resume]; |
NSURLSessionTask是一个抽象子类,它有三个具体的子类是可以直接使用的:NSURLSessionDataTask,NSURLSessionUploadTask和NSURLSessionDownloadTask。这三个类封装了现代应用程序的三个基本网络任务:获取数据,比如JSON或XML,以及上传下载文件。dataTaskWithRequest方法用的比较多,关于下载文件代码完成之后会保存一个下载之后的临时路径:
1
2
3
|
NSURLSessionDownloadTask *downloadTask=[urlSession downloadTaskWithRequest:urlRequest completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) { }]; |
NSURLSessionUploadTask上传一个本地URL的NSData数据:
1
2
3
|
NSURLSessionUploadTask *uploadTask=[urlSession uploadTaskWithRequest:urlRequest fromData:[NSData new ] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
}]; |
NSURLSession在Foundation中我们默认使用的block进行异步的进行任务处理,当然我们也可以通过delegate的方式在委托方法中异步处理任务,关于委托常用的两种NSURLSessionTaskDelegate和NSURLSessionDownloadDelegate,其他的关于NSURLSession的委托有兴趣的可以看一下API文档,首先我们需要设置delegate:
1
2
3
4
5
6
|
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *inProcessSession = [NSURLSession sessionWithConfiguration:sessionConfig delegate :self delegateQueue:nil];
NSString *url = @"http://www.cnblogs.com/xiaofeixiang" ;
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; NSURLSessionTask *dataTask = [inProcessSession dataTaskWithRequest:request]; [dataTask resume]; |
任务下载的设置delegate:
1
2
3
4
5
6
|
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *inProcessSession = [NSURLSession sessionWithConfiguration:sessionConfig delegate :self delegateQueue:nil];
NSString *url = @"http://www.cnblogs.com/xiaofeixiang" ;
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; NSURLSessionDownloadTask *downloadTask = [inProcessSession downloadTaskWithRequest:request]; [downloadTask resume]; |
关于delegate中的方式只实现其中的两种作为参考:
1
2
3
4
5
6
7
8
9
|
#pragma mark - NSURLSessionDownloadDelegate -( void )URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{
NSLog( @"NSURLSessionTaskDelegate--下载完成" );
} #pragma mark - NSURLSessionTaskDelegate -( void )URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{
NSLog( @"NSURLSessionTaskDelegate--任务结束" );
} |
NSURLSession状态同时对应着多个连接,不能使用共享的一个全局状态,会话是通过工厂方法来创建配置对象。
defaultSessionConfiguration(默认的,进程内会话),ephemeralSessionConfiguration(短暂的,进程内会话),backgroundSessionConfigurationWithIdentifier(后台会话)
第三种设置为后台会话的,当任务完成之后会调用application中的方法:
1
2
3
|
-( void )application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:( void (^)())completionHandler{
} |
网络封装
上面的基础知识能满足正常的开发,我们可以对常见的数据get请求,Url编码处理,动态添加参数进行封装,其中关于url中文字符串的处理
stringByAddingPercentEncodingWithAllowedCharacters属于新的方式,字符允许集合选择的是URLQueryAllowedCharacterSet,
NSCharacterSet中分类有很多,详细的可以根据需求进行过滤~
1
2
3
4
5
6
7
8
9
|
typedef void (^CompletioBlock)(NSDictionary *dict, NSURLResponse *response, NSError *error);
@ interface FENetWork : NSObject
+( void )requesetWithUrl:(NSString *)url completeBlock:(CompletioBlock)block;
+( void )requesetWithUrl:(NSString *)url params :(NSDictionary *) params completeBlock:(CompletioBlock)block;
@end |
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
31
32
|
@implementation FENetWork +( void )requesetWithUrl:(NSString *)url completeBlock:(CompletioBlock)block{
NSString *urlEnCode=[url stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
NSURLRequest *urlRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:urlEnCode]];
NSURLSession *urlSession=[NSURLSession sharedSession];
NSURLSessionDataTask *dataTask=[urlSession dataTaskWithRequest:urlRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error) {
NSLog( @"%@" ,error);
block(nil,response,error);
} else {
NSDictionary *content = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
block(content,response,error);
}
}];
[dataTask resume];
} +( void )requesetWithUrl:(NSString *)url params :(NSDictionary *) params completeBlock:(CompletioBlock)block{
NSMutableString *mutableUrl=[[NSMutableString alloc]initWithString:url];
if ([ params allKeys]) {
[mutableUrl appendString: @"?" ];
for (id key in params ) {
NSString *value=[[ params objectForKey:key] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
[mutableUrl appendString:[NSString stringWithFormat: @"%@=%@&" ,key,value]];
}
}
[self requesetWithUrl:[mutableUrl substringToIndex:mutableUrl.length-1] completeBlock:block];
} @end |
本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/5153247.html,如需转载请自行联系原作者