1.session和task
使用NSURLSession的时候,最重要的两个概念就是session和task!!!每次提到NSURLSession就马上想到这两个概念,马上就知道该怎么写了。
创建session有两种方式:
NSURLSession* session = [NSURLSession sharedSession];
NSURLSession* session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
创建task,NSURLSessionTask类本身是一个抽象类,不能创建对象,根据不同的需求调用他的子类去创建task对象。
NSURLSessionDataTask* task = [session dataTaskWithRequest:request];
NSURLSessionDownloadTask* downloadTask = [session downloadTaskWithURL:url];
NSURLSessionUploadTask* uploadTask = [session uploadTaskWithRequest:request fromData:[NSData dataWithContentsOfURL:url]];
2.发送get请求和post请求
⚠️:请求到的数据默认是在子线程解析的。
NSURLSessionDataTask* postTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { ⚠️:在子线程解析数据!!! 如果要执行更新UI的操作需要回到主线程 }];
3.代理方法
三个常用的代理方法:
didReceiveResponse
didReceiveData
didCompleteWithError
4.文件的下载
4.1.NSURLSessionDownloadTask,通过block回调进行下载,好处:不会像NSURLConnection那样出现内存暴增的问题,因为完成了边下载边写入磁盘的操作。但是无法检测到文件的下载进度。
NSURLSessionDownloadTask* task = [session downloadTaskWithRequest:request completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//这个函数默认会完成下载文件和写入沙盒的操作,但是他写入的是临时文件夹,很快就会被删除,我们需要将它写入指定的文件夹
//response.suggestedFilename这个返回的就是图片的名称
//拼接全路径
NSString* fullPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:response.suggestedFilename];
//剪切文件
[[NSFileManager defaultManager]moveItemAtURL:location toURL:[NSURL fileURLWithPath:fullPath] error:nil];
NSLog(@"fullPath-----%@",fullPath);
} ];
4.2用代理方法下载文件,可以检测到文件下载的进度,但是存在巨大的问题就是不支持离线缓存,程序退出以后再进入就需要从头开始下载。
4.3用NSURLSessionDataTask可以实现离线断点下载,但是很麻烦。
网友评论