• IOS


    NSURLConnection断点下载相比较NSURLSession断点下载更复杂一些,因为很多方法得自己写,所以更加推荐使用NSURLSession断点下载,而且NSURLConnection以后估计也不会更新了,NSURLSession慢慢会取代它,但是还是有很多程序用的是Connection。
    断点下载步骤:
    (1)一些需要用的声明,和上一篇基本一样

    @property(nonatomic,strong) NSFileHandle *writeHandle;
    @property(nonatomic,assign) long long totalLength;
    @property(nonatomic,assign) long long currentLength;
    @property(nonatomic,strong) UIProgressView *progessView;
    @property(nonatomic,strong) NSURLConnection *conn;

    (2)一个按钮控制暂停还是下载,注意:NSURLConnection 只有取消 没有暂停,想暂停任务只能取消NSURLConnection

    - (void)download:(UIButton *)btn
    {
        // 状态取反
        btn.selected=!btn.isSelected;
        if (btn.selected) {// download
            [self startDownload];
        }else{ // pause
            //NSURLConnection 只有取消 没有暂停
            [self.conn cancel];
            self.conn=nil;
        }
    }
    

    (3)下载任务,重点是实现了每次下载从self.currentLength 开始下载,放在请求头里

    - (void)startDownload{
        NSURL *url=[NSURL URLWithString:@"http://m2yd.pc6.com/mac/WeChatzhCN.dmg"];
        // 只有NSMutableURLRequest能改变请求头
        NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];
        /**
         *  设置请求头
            注意不用进行加1操作 从0开始下载
         */
        // 一下操作实现了每次下载从self.currentLength 开始下载
        NSString *range=[NSString stringWithFormat:@"bytes=%lld-",self.currentLength];
        [request setValue:range forHTTPHeaderField:@"Range"];
        // 下载 自动发起一个异步请求
        self.conn=[NSURLConnection connectionWithRequest:request delegate:self];
    }

    (4)下载链接成功方法,重点是:if (self.currentLength) return; 因为如果要是当前下载进度不为0的话,(就是不是一开始下载,是暂停之后继续下载)这样就不调用这个方法,以为如果调用这个方法又会创建一个新文件,以下载的数据就没了

    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
    {
        if (self.currentLength) return;
    
        NSString *caches=[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject];
        NSString *filepath=[caches stringByAppendingPathComponent:@"WeChatzhCN.dmg"];
    
        // 先创建一个0kb文件 到沙盒
        NSFileManager *mgr=[NSFileManager defaultManager];
    
        NSLog(@"%@",filepath);
        [mgr createFileAtPath:filepath contents:nil attributes:nil];
        // 创建写数据的文件句柄
        self.writeHandle=[NSFileHandle fileHandleForWritingAtPath:filepath];
    
        //得到下载文件总大小
        self.totalLength=response.expectedContentLength;
    
    }
    

    (5)接收下载数据,重点是:在这里记录当前一共下载多少了

    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
    {
        // 移动到文件的最后写入数据
        [self.writeHandle seekToEndOfFile];
        [self.writeHandle writeData:data];
        self.currentLength+=data.length;
        NSLog(@"下载进度%f",(double)self.currentLength/self.totalLength);
        self.progessView.progress=(double)self.currentLength/self.totalLength;
    }
    

    (6)下载完成,收尾操作

    - (void)connectionDidFinishLoading:(NSURLConnection *)connection
    {
        self.currentLength = 0;
        self.totalLength = 0;
        // 关闭文件
        [self.writeHandle closeFile];
        self.writeHandle=nil;
    }

    总结注意点,重点:
    (1)暂停任务只能取消NSURLConnection
    (2)重点是实现了每次下载从self.currentLength 开始下载,放在请求头里
    (3)下载链接成功时,重点是盘算if (self.currentLength) return; 因为如果要是当前下载进度不为0的话,(就是不是一开始下载,是暂停之后继续下载)这样就不调用这个方法,以为如果调用这个方法又会创建一个新文件,以下载的数据就没了
    (4)接收下载数据时,要在方法里记录当前一共下载多少了

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    剑指offer14-链表中倒数第k个结点
    剑指offer15-翻转链表
    Matlab矩阵操作
    CUDA线程
    CUDA编程前言
    ROS常用工具
    ROS理解参数服务器param demo
    ROS手动编写服务端和客户端service demo(C++)
    ROS手动编写消息发布器和订阅器topic demo(C++)
    ROS参数服务器(Parameter Server)
  • 原文地址:https://www.cnblogs.com/yuqingzhude/p/4836505.html
Copyright © 2020-2023  润新知