博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS开发-NSURLSession详解
阅读量:6670 次
发布时间:2019-06-25

本文共 5778 字,大约阅读时间需要 19 分钟。

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,如需转载请自行联系原作者

你可能感兴趣的文章
Salesforce开源TransmogrifAI:用于结构化数据的端到端AutoML库
查看>>
社会的分工合作(ASIC)才是带来人类富裕的基础
查看>>
全面剖析SharedPreferences
查看>>
0826 - 事情多到让人绝望啊
查看>>
Logback中使用TurboFilter实现日志级别等内容的动态修改
查看>>
Spring Boot中增强对MongoDB的配置(连接池等)
查看>>
网络安全-CSRF
查看>>
Andorid Studio NDK开发-Hello World
查看>>
IDEA中maven工程指定JDK版本
查看>>
Git 详细的操作指南笔记(从零开始)
查看>>
【手把手带你撸一个脚手架】第二步, 搭建开发环境
查看>>
JS专题之严格模式
查看>>
Python设计模式-装饰器模式
查看>>
前端每周清单第 30 期:WebVR 指南,Vue 代码分割范式,理想的 React 架构特性
查看>>
C 语言结构体内存布局问题
查看>>
js 数组排序
查看>>
iOS VIPER架构实践(一):从MVC到MVVM到VIPER
查看>>
Android鬼点子-近期项目总结(2)-日历
查看>>
是时候学习真正的 spark 技术了
查看>>
android开发怎么少的了后端(上)
查看>>