美文网首页
NSURLConnection和NSURLSession的区别

NSURLConnection和NSURLSession的区别

作者: 8fe8946fa366 | 来源:发表于2018-04-02 10:48 被阅读24次

    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并没有做实质的事,他有三个不同的子类,负责执行不同类型的请求操作:NSURLSessionDataTaskNSURLSessionUploadTaskNSURLSessionDownloadTask。创建完之后的状态都是挂起,需要手动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),暂停以后可以通过继续恢复当前的请求任务。

    相关文章

      网友评论

          本文标题:NSURLConnection和NSURLSession的区别

          本文链接:https://www.haomeiwen.com/subject/odaacftx.html