IOS 开发 网络详解(十三) URLSesstion详解

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的代理方法
NSURLSession​Download​Delegate : 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 响应网络事件及数据
原文地址:https://www.cnblogs.com/guchengfengyun/p/8098298.html