NSURLSession

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可以实现离线断点下载,但是很麻烦。

你可能感兴趣的:(NSURLSession)