简述:服务器
在上一节中介绍了一下NSURLSession
,也介绍了一下NSURLSessionDownloadTask
的普通下载图片使用,并无使用到具备进度的下载,那么在这一节中,咱们看看如何使用进度下载,实时的进行界面的更新,这里的界面的更新也就是咱们的Progress View(进度条)控件进度的一个更新session
代码:atom
一、首先在storyboard里面拖入一个Progress View(进度条)控件,而且在控制器中拖入Progress View属性,用于后面的界面更新 @interface ViewController ()<NSURLSessionDownloadDelegate> @property (weak, nonatomic) IBOutlet UIProgressView *progressView; @end 二、完成上面的步骤了,那么如今就是进行三部曲了 2.一、建立NSURLSession 2.二、建立任务(task) 2.三、执行任务 - (void)viewDidLoad { [super viewDidLoad]; // 1.建立NSURLSession /* 第一个参数: 全局的配置 第二个参数: 让谁成为session的代理 第三个参数: 告诉系统代理方法在哪一个线程中执行 */ //1.1建立URL NSURL *url = [NSURL URLWithString:@"http://d.pcs.baidu.com/file/2b66fa1c93d8322d5299a1befc59b16c?fid=204559171-250528-1042286675318370&time=1453435914&rt=sh&sign=FDTAERV-DCb740ccc5511e5e8fedcff06b081203-X%2Bcz8N4IQb25c4wIKAyYl1HHW2M%3D&expires=8h&chkv=1&chkbd=0&chkpc=&dp-logid=498837374116132296&dp-callid=0&r=107651804"]; NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]]; // 二、利用NSURLSessionDownloadTask建立任务(task) NSURLSessionDownloadTask *task = [session downloadTaskWithURL:url]; // 三、执行任务 [task resume]; } 三、基本上到这里就是设置代理了,代理一运行,咱们就完事了, /* 1.接收到服务器返回的数据 bytesWritten: 当前这一次写入的数据大小 totalBytesWritten: 已经写入到本地文件的总大小 totalBytesExpectedToWrite : 被下载文件的总大小 */ - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite { //给progressView赋值进度 self.progressView.progress = 1.0 * totalBytesWritten / totalBytesExpectedToWrite; } /* 2.下载完成 downloadTask:里面包含请求信息,以及响应信息 location:下载后自动帮我保存的地址 */ - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location { //location为下载好的文件路径 //NSLog(@"didFinishDownloadingToURL, %@", location); //一、生成的Caches地址 NSString *cacepath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingString:downloadTask.response.suggestedFilename]; //二、移动图片的存储地址 NSFileManager *manager = [NSFileManager defaultManager]; [manager moveItemAtURL:location toURL:[NSURL fileURLWithPath:cacepath] error:nil]; } /* 3.请求完毕 若是有错误, 那么error有值 */ - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { if (!error) { NSLog(@"请求成功"); }else{ NSLog(@"请求失败"); } }
补充
在代理中,咱们有两个重要的代理方法:url
一、当前返回数据的大小
二、已经写入临时文件数据的大小
三、下载数据的总大小
那么在这个代理方法里面就是设置好咱们Progress View(进度条)控件的进度的,只要第二个重要的代理方法就是线程
第二个就是下载完成以后,回调的方法,里面传给咱们两个参数:3d
一、请求信息已经响应信息
二、下载完,文件保存的路径(路径为咱们沙盒的temp临时文件夹,里面的数据随时可能被删除)
代理
咱们能够在这个方法中把所下载的文件,移动到某一个长期保存而不会随时删除的文件夹中,这里我是把它保存到咱们的Caches中去了code
结束图片
本章到此结束 欢迎各位码友随意转载并指正