NSURLsession利用输出流断点续传

输出流:NSOutputStream
作用:用于与下载

//outputStreamToFileAtPath: append:; 方法会根据路径创建文件,append是否追加任务  
 NSOutputStream *stream = [NSOutputStream outputStreamToFileAtPath:path append:YES];
    //打开输出流
    [self.stream open];

注意点:如果path下有文件,输出流会在该文件下追加任务,如果该路径下没有文件,open方法会创建文件,输出流再次文件下追加任务

断点下载核心代码
用于解决重新开始下载,会把文件重新下载一遍,而非下载还未下载的数据,造成的后果就是下载文件的数据越来越大

 //设置请求头信息
    NSString *range = [NSString stringWithFormat:@"bytes=%zd-",currentSize];
    
    [request setValue:range forHTTPHeaderField:@"Range"];

如何得到已经下载的文件大小

 //0.得到已经下载的文件数据的大小
    /*
     第一个参数:文件的路径
     */
    //获取要下载数据到哪个文件的路径
    self.path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:KFileName];
    NSLog(@"%@",self.path);

    //获取已下载的数据大小
   NSDictionary *file = [[NSFileManager defaultManager] attributesOfItemAtPath:self.path error:nil];
    NSLog(@"%@",file);
    NSInteger currentData = [file[@"NSFileSize"] integerValue];
    self.currentData = currentData;

注意点:如果要显示进度信息,预计下载的大小是此次要下载数据的大小,所以要加上之前已经下载的数据大小,才是文件的总大小

//在代理方法-didReceiveResponse中
 //获取数据总大小
    self.totalData = response.expectedContentLength + self.currentData;
   



原文地址:https://www.cnblogs.com/xzk-it/p/6576577.html