1.NSURLConnection的常用方法
发送网络请求的三种方法:这几个api现在都被废弃了
发送同步请求 sendSynchronousRequest:(NSURLRequest *)request
发送异步请求 sendAsynchronousRequest:(NSURLRequest*) request
代理发送异步请求 )initWithRequest:(NSURLRequest *)request delegate:(nullable id)delegate
2.NSURLSession的常用方法
两个主要的概念session和task
创建session有两种方法:
1.NSURLSession* session = [NSURLSessionsharedSession];
2NSURLSession* session = [NSURLSessionsessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]delegate:self delegateQueue:[[NSOperationQueue alloc]init]];设置了代理和任务执行的队列
⚠️:这里就是一个用了NSOperation但是没有用gcd的🌰
创建task:可以创建三种类型的task,NSURLSessionTask并没有做实质的事,他有三个不同的子类,负责执行不同类型的请求操作:NSURLSessionDataTask、NSURLSessionUploadTask和NSURLSessionDownloadTask。创建完之后的状态都是挂起,需要手动resume。
⚠️:NSURLSessionConfiguration是创建session时设置的请求参数,这个参数包含哪些信息呢?
3.下载文件的区别
NSURLConnection下载文件的时候先把文件下载到内存,然后写入沙盒,这样做如果下载的文件非常大就会引起内存的暴增,原生的NSURLConnectionAPI是没有办法解决这个问题的,需要我们进行额外的操作。
思路:
1.在接受到响应的时候,即在didReceiveResponse中创建一个空的沙盒文件,并且创建一个NSFilehandle类。
2.在接受到具体数据的时候,即在didReceiveData中向沙盒文件中写入数据。
通过NSFilehandle的- (void)seekToFileOffset:(unsigned long long)offset;方法,制定文件的写入位置。或者通过NSFilehandle的- (unsigned long long)seekToEndOfFile;方法,直接制定文件的写入位置为文件末尾。
然后通过NSFilehandle的writeData方法,我们可以将数据不断写入沙盒文件。
3.在下载完成之后,关闭沙盒文件。
NSURLSession就不需要这么麻烦了,他在下载文件的时候自动就实现了一边下载一边写入沙盒的操作。使用NSURLSessionUploadTask下载文件,会默认下载到沙盒中的tem文件中,不会出现内存暴涨的情况,但是在下载完成后会把temp中的临时文件删除,需要在初始化任务方法时,在completionHandler回调中增加保存文件的代码。还有一个缺点是无法获取下载文件的进度。
思路:
[self.taskcancelByProducingResumeData:^(NSData*_NullableresumeData) {
self.resumeData= resumeData;
}];
取消以后再开始下载的时候,通过resumeData重新创建一个task
if(self.resumeData) {
//如果resumeData有值的话,就说明是暂停以后继续下载的,重新定义task
self.task= [self.sessiondownloadTaskWithResumeData:self.resumeData];
}
⚠️:NSURLSession没办法做到离线断点续传。
4.发送请求的区别
NSURLConnection实例化对象,实例化开始,默认请求就发送(同步发送),不需要调用start方法。而cancel可以停止请求的发送,停止后不能继续访问,需要创建新的请求。
NSURLSession有三个控制方法,取消(cancel)、暂停(suspend)、继续(resume),暂停以后可以通过继续恢复当前的请求任务。