NSURLSession之下载

1:首先就是下载图片

NSURLSessionConfiguration * config=[NSURLSessionConfiguration defaultSessionConfiguration];

//创建一个session

NSURLSession * session=[NSURLSession sessionWithConfiguration:config];

NSURL * url =[NSURL URLWithString:urlString];

//创建一个任务请求到data数据然后将其转化成图片

NSURLSessionDataTask * dataTask=[session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

self.imageView.image=[UIImage imageWithData:data];

}];

[dataTask resume];

2:主要谈一下一些比较大的文件的下载

其实有很多第三方库集成的很好,用法就不多说了,这里主要用系统自带的URLSession进行文件的下载

1:首先我们需要遵循NSURLSessionDownloadDelegate代理,因为要用到其代理方法获取当前进度以及结束等状态

2接着我们根据网址创建一个NSURL,然后创建Session的配置信息,接着就是创建Session,遵循其代理,然后执行下载任务。

-(void)loadFileWithUrl:(NSString *)str

{

NSURL * url =[NSURL URLWithString:str];

NSURLSessionConfiguration * config =[NSURLSessionConfiguration defaultSessionConfiguration];

NSURLSession *session= [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];

NSURLSessionDownloadTask* downloadTask = [session downloadTaskWithURL:url];

[downloadTask resume];

}

3:其实主要处理还是在代理方法中

-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{

}

这是结束的代理方法,这里主要处理下载结束后我们要进行的操作

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask    didWriteData:(int64_t)bytesWritten     totalBytesWritten (int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite

{

self.myPregress.progress = (double)totalBytesWritten/totalBytesExpectedToWrite;

self.pgLabel.text = [NSString stringWithFormat:@"下载进度:%f",(double)totalBytesWritten/totalBytesExpectedToWrite];

}

这个是程序正在下载的代理方法,我们可以从其中获取到当前的进度

参数*  @param bytesWritten              这次写入的大小

*  @param totalBytesWritten        已经写入沙盒的大小

*  @param totalBytesExpectedToWrite 文件总大小

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask

didResumeAtOffset:(int64_t)fileOffset

expectedTotalBytes:(int64_t)expectedTotalBytes

{

}这个就是当前的下载任务暂停后回复下载后调用的方法

3:下载的暂停回复

1:暂停

__weak typeof(self) selfVc = self;

[self.downloadTask cancelByProducingResumeData:^(NSData *resumeData) {

//  resumeData : 包含了继续下载的开始位置\下载的url

selfVc.resumeData = resumeData;

selfVc.downloadTask = nil;

}];

主要就是将当前已经下载的resumeData存储下来,然后将downloadTask置为nil

2:回复

// 传入上次暂停下载返回的数据,就可以恢复下载

self.downloadTask = [self.session downloadTaskWithResumeData:self.resumeData];

[self.downloadTask resume]; // 开始任务

self.resumeData = nil;

你可能感兴趣的:(NSURLSession之下载)