1.类结构
2.NSURLSesstion
session分为 :
1.全局共享单例session : NSURLSession sharedSession, 有一定的局限性
2.自定义session : 自定义配置文件, 设置代理, 大部分时间我们都是用这个
3.后台session : 也是自定义session的一种, 只是他专门用于做后台上传/下载任务
session为哪一种类型完全由其内部的Configuration而定.
3.NSURLSesstionConfiguration
配置分为 :
defaultSessionConfiguration : 系统默认
ephemeralSessionConfiguration : 仅内存缓存, 不做磁盘缓存的配置
backgroundSessionConfiguration : 这里需要指定一个identifier, identifier用来后台重连session对象. (做后台上传/下载就是这个config)
另外, 我们还可以给Configuration对象再自定义一些属性, 例如每端口的最大并发HTTP请求数目, 以及是否允许蜂窝网络, 请求缓存策略, 请求超时, cookies/证书存储策略等等
4.NSURLSesstionDelegate
session管理的一组tasks共享一个代理, 不想实现代理方法时, 代理传nil即可.
代理协议分为 :
NSURLSessionDelegate : session-level的代理方法
NSURLSessionTaskDelegate : task-level面向all的代理方法
NSURLSessionDataDelegate : task-level面向data和upload的代理方法
NSURLSessionDownloadDelegate : task-level的面向download的代理方法
NSURLSessionStreamDelegate : task-level的面向stream的代理方法
5.NSURLSesstionTask
session task类型分为 :
NSURLSessionTask : Task的抽象基类
NSURLSessionDataTask : 以NSData的形式接收一个URLRequest的内容
NSURLSessionUploadTask : 上传NSData或者本地磁盘中的文件, 完成后以NSData的形式接收一个URLRequest的响应
NSURLSessionDownloadTask : 下载完成后返回临时文件在本地磁盘的URL路径
NSURLSessionStreamTask : 用于建立一个TCP/IP连接
6.使用
//GET请求---dataTaskWithURL
NSURLSessionTask *task = [session dataTaskWithURL:url
completionHandler:^(NSData *data, NSURLResponse *response, NSError error) {
NSLog(@"%@", [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]);
}];
//POST请求---dataTaskWithRequest
NSURLSessionTask *task = [session dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSLog(@"%@", [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]); }];
//下载请求---downloadTaskWithURL
NSURLSessionDownloadTask *task = [session downloadTaskWithURL:url completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
// location是沙盒中tmp文件夹下的一个临时url,文件下载后会存到这个位置,由于tmp中的文件随时可能被删除,所以我们需要自己需要把下载的文件挪到需要的地方
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];
// 剪切文件
[[NSFileManager defaultManager] moveItemAtURL:location toURL:[NSURL fileURLWithPath:path] error:nil];
}];
//上传请求---uploadTaskWithRequest
NSURLSessionUploadTask *task =
[[NSURLSession sharedSession] uploadTaskWithRequest:request
fromFile:fileName
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
}];
[task resume];
7.NSURLSesstionDataDelegate
// 1.接收到服务器的响应
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler {
// 允许处理服务器的响应,才会继续接收服务器返回的数据
completionHandler(NSURLSessionResponseAllow);
}
// 2.接收到服务器的数据(可能调用多次)
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
// 处理每次接收的数据
}
// 3.请求成功或者失败(如果失败,error有值)
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
// 请求完成,成功或者失败的处理
}
8.NSURLSesstionDownLoadDelegate
// 每次写入调用(会调用多次)
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {
// 可在这里通过已写入的长度和总长度算出下载进度
CGFloat progress = 1.0 * totalBytesWritten / totalBytesExpectedToWrite;
NSLog(@"%f",progress);
}
// 下载完成调用
- (void)URLSession:(NSURLSession *)session
downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location {
// location还是一个临时路径,需要自己挪到需要的路径(caches下面)
NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:downloadTask.response.suggestedFilename];
[[NSFileManager defaultManager] moveItemAtURL:location toURL:[NSURL fileURLWithPath:filePath] error:nil];
}
// 任务完成调用
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
}
9.Task的自身方法
- (void)suspend;
- (void)resume;
- (void)cancel;
10.总结
1.创建NSURLSessionConfig对象
2.用之前创建的NSURLSessionConfig对象创建配置NSURLSession对象。
3.用NSURLSession对象创建对应的task对象 并用resume方法执行之。
4.用delegate方法或completion block 响应网络事件及数据