断点下载

需要遵循NSURLConnectionDataDelegate协议
/**

  • 当前的长度
    /
    @property (nonatomic ,assign) long long currentLenth;
    /
    *
  • 总体的长度
    /
    @property (nonatomic ,assign) long long totalLenth;
    /
    *
  • 连接类
    /
    @property (nonatomic ,strong) NSURLConnection connection;
    /
  • 文件句柄
    */
    @property (nonatomic, strong) NSFileHandle *writeHandle;
    @property (weak, nonatomic) IBOutlet UISlider *slider;
    @property (weak, nonatomic) IBOutlet UIButton *startOrPause;
  • (void)viewDidLoad{
    [super viewDidLoad];
    NSString *path = [NSSearchPathForDirectorInDomains (NSCacheDirectory,NSUserDomainMask,YES)lastObject];
    NSString *filePath = [path stringByAppendingPathComponent:@"123.rar"]
    NSDictionary *dic = [NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil];
    self.slider.value = 0;
    }

  • (void)createFilePath{
    //创建文件路径
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES)lastObject];
    NSString *filePath = [path stringByAppendingPathComponent:@"123.rar"];
    // //文件管理器
    NSFileManager *manager = [NSFileManager defaultManager];
    // //用来创建一个空的文件
    [manager createFileAtPath:filePath contents:nil attributes:nil];
    // //创建文件句柄,用来给空文件写入数据
    self.writeHandle = [NSFileHandle fileHandleForWritingAtPath:filePath];
    }

  • (IBAction)startOrPause:(id)sender {
    UIButton *Btn = sender;
    if (Btn.selected == YES) {
    //取消下载,停止此次下载,如果想继续下载,就需要创建新的连接
    [self.connection cancel];
    [self.writeHandle closeFile];
    self.writeHandle = nil;
    _slider.value = 0;
    }else{

    NSURL *url = [NSURL URLWithString:@"http://gdown.baidu.com/data/wisegame/49b4918a76c8eba0/xunlei_10560.apk"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    NSString *range = [NSString stringWithFormat:@"bytes=%lld-",self.currentLenth];
    //设置请求头,从上次停止的位置开始下载
    //假如是一个新的下载,那self.currentLenth = 0,从0的位置开始下载
    [request setValue:range forHTTPHeaderField:@"range"];
    self.connection = [NSURLConnection connectionWithRequest:request delegate:self];
    }

    Btn.selected = !Btn.selected;
    }

pragma mark - delegate

  • (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    [self createFilePath];
    //如果self.currentLenth有数据,那么说明他不是第一次下载
    if (self.currentLenth) {
    self.totalLenth = response.expectedContentLength + self.currentLenth;

      return;
    

    }
    //获取到文件的长度
    self.totalLenth = response.expectedContentLength;
    }

  • (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    //移动到文件尾部
    [self.writeHandle seekToEndOfFile];
    //写入数据

    [self.writeHandle writeData:data];
    self.currentLenth += data.length;
    NSLog(@"%f",(float)self.currentLenth/(float)self.totalLenth);
    float sliderValue = (float)self.currentLenth/(float)self.totalLenth;
    [_slider setValue:sliderValue animated:YES];
    }

  • (void)connectionDidFinishLoading:(NSURLConnection *)connection{

    self.currentLenth = 0;
    self.totalLenth = 0;
    NSLog(@"%lld---%lld",self.currentLenth,self.totalLenth);
    //关闭文件句柄
    [self.writeHandle closeFile];
    self.writeHandle = nil;
    self.slider.value = 0;
    self.startOrPause.selected = NO;
    }

  • (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容