从网上DownLoad(断点下载)

方法步骤一、storyboard布局

#import "ViewController.h"

@interface ViewController ()<NSURLSessionDownloadDelegate>
///显示图片的
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
///显示进度的
@property (weak, nonatomic) IBOutlet UIProgressView *progressView;

///下载任务的属性
@property (nonatomic,strong)NSURLSessionDownloadTask *task;
///网络请求类
@property (nonatomic,strong)NSURLSession *session;
///发送请求类
@property (nonatomic,strong)NSURLRequest *request;

///用于保存已经下载的数据的,供继续下载使用
@property(nonatomic,strong)NSMutableData *data;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.progressView.progress = 0  ;
   
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
#pragma mark - 开始下载
- (IBAction)startButton:(id)sender {
    NSString *urlStr = @"http://f.hiphotos.baidu.com/zhidao/wh%3D450%2C600/sign=2b7d8fd27fd98d1076810435140f9438/503d269759ee3d6d505b9ee540166d224f4ade7a.jpg";
    NSURL *url = [NSURL URLWithString:urlStr];
    
    self.request = [NSURLRequest requestWithURL:url];
    //创建NSURLSession
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    //网络请求
    self.session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:([NSOperationQueue mainQueue])];
    //下载请求任务
    self.task = [self.session downloadTaskWithRequest:self.request];
    
    //开启
    [self.task resume];
    
    
}
#pragma mark - 暂停下载
- (IBAction)pauseButton:(id)sender {
    //暂停
    if (self.task) {
        //暂停并保存之前已经下载的内容
        __weak typeof(self)weakSelf = self;
        [self.task cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
            weakSelf.data = [NSMutableData data];
        }];
    }
    [self.task suspend];
}
#pragma mark - 继续下载
- (IBAction)continueButton:(id)sender {
    //哦按段当前任务是否存在,是发送请求还是处理数据
    
    if (self.task!=nil) {
        //说明已经下载,这里要处理的就是数据
        self.task = [self.session downloadTaskWithResumeData:self.data];
    }else {
        //此时没有下载任何内容,应该重新发送求求进行下载
        self.task = [self.session downloadTaskWithRequest:self.request];
    }
    //启动
    [self.task resume];
    
}
#pragma mark - 代理方法
//下载完成走的方法
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location {
    //找到文件夹管理器
    
    NSFileManager *fileManager = [NSFileManager defaultManager];
    
    //先找到沙盒
    NSArray *urlArray = [fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];
    
    //根据沙盒路径获取Document路径
    
    NSURL *url = [urlArray objectAtIndex:0];
    NSLog(@"url=====%@",url);
    
//    response.suggestedFilename:建议使用的文件名,一般根服务端的文件名一致
    
    NSURL *saveUrl = [url URLByAppendingPathComponent:downloadTask.response.suggestedFilename];
    
    NSLog(@"sabrUrl -------%@",saveUrl);
    //location:临时文件的路径(下载好的文件)
    //AtPath:剪切前的文件路径 //ToPath:剪切后的文件路径
    [fileManager moveItemAtPath:location.path toPath:saveUrl.path error:nil];
    self.imageView.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:saveUrl]];
  
}

#pragma mark - 下载完,部分就会调用(可能被调用多次)

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {
    
    //下载当前段的数据
    NSLog(@"bytesWrite = %lld",bytesWritten);
    NSLog(@"totalytesWritten = %lld",totalBytesWritten);
    NSLog(@"titalBytesExpectedToWrite = %lld",totalBytesExpectedToWrite);
    
    
    
    self.progressView.progress = (CGFloat)totalBytesWritten /(CGFloat)totalBytesExpectedToWrite;
    
    
    NSLog(@"%f",self.progressView.progress);
}


@end

原文地址:https://www.cnblogs.com/mingjieLove00/p/5544073.html