前两节,我介绍了ASI的“同步与异步”及“文件上传”的知识,如有什么疑问的,请点击这里。这一节通过一个简单的例子,介绍一下通过ASI实现文件的下载。
界面很简单,"Start": 开始下载; “Stop”: 暂停下载; 支持断点续传。
1.要定义一个request成员属性,对ASI的request对象进行强引用。
@property(nonatomic,strong) ASIHTTPRequest *request;
2.实现代理ASIProgressDelegate,用来显示进度条的进度。
// 当发出一个请求,也许5秒之后才有响应,没有等到响应回来的时候你就切换了控制器,则产生了野指针!!! 所以一定要在控制器销毁的时候调用下面代码!! - (void)dealloc { [self.request clearDelegatesAndCancel]; }
- (IBAction)start { [self downloadFile]; } - (IBAction)stop { [self.request clearDelegatesAndCancel]; }
- (void)downloadFile { // 1. 创建请求对象(我使用的测试链接,是下载的搜狗输入法) NSURL *url = [NSURL URLWithString:@"http://www.baidu.com/link?url=bvCTezSVwkMRVbM2cQ5ntfsumx3AhZOEVzpe6EfbneMN8GFmkhC0BfXkoq1Sfus9v-wW19U37IvbEkdO5dWvRYeakTk0uPtTBzz6Xa5gF_y"]; self.request = [ASIHTTPRequest requestWithURL:url]; // 2. 文件保存路径 NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; // 下载完毕后正式的文件 NSString *filePath = [caches stringByAppendingPathComponent:@"sougou.zip"]; self.request.downloadDestinationPath = filePath; // 临时下载文件,用来支持断点续传。续传成功会自动生成sougou.zip NSString *tempFilePath = [caches stringByAppendingPathComponent:@"sougou.temp.zip"]; self.request.temporaryFileDownloadPath = tempFilePath; // 3. 设置下载进度代理 // 用self.progressView作为代理,因为UIProgressView本身就有setProgress方法,相当于也实现了setProgress的代理方法。就能直接看到progressView的显示进度了,一举两得. self.request.downloadProgressDelegate = self.progressView; //self.request.downloadProgressDelegate = self; // 4. 请求超时控制 self.request.timeOutSeconds = 10; // 5. 支持断点续传 self.request.allowResumeForFileDownloads = YES; [self.request startAsynchronous]; }
self.request.downloadProgressDelegate = self.progressView;
上面一句代码其实等价于
self.request.downloadProgressDelegate = self; - (void)setProgress:(float)newProgress { // NSLog(@"Thread:%@",[NSThread currentThread]); self.progressView.progress = newProgress; }