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;
网友评论