ASI使用介绍(文件下载)

前两节,我介绍了ASI的“同步与异步”及“文件上传”的知识,如有什么疑问的,请点击这里。这一节通过一个简单的例子,介绍一下通过ASI实现文件的下载。

界面很简单,"Start": 开始下载; “Stop”: 暂停下载; 支持断点续传。

ASI使用介绍(文件下载)_第1张图片


1.要定义一个request成员属性,对ASI的request对象进行强引用。

@property(nonatomic,strong)  ASIHTTPRequest *request;


2.实现代理ASIProgressDelegate,用来显示进度条的进度。


3. 在dealloc方法中,要对ASI的request对象进行销毁工作。

// 当发出一个请求,也许5秒之后才有响应,没有等到响应回来的时候你就切换了控制器,则产生了野指针!!! 所以一定要在控制器销毁的时候调用下面代码!!
- (void)dealloc {
    [self.request clearDelegatesAndCancel];
}

4. start 与 stop方法如下。

- (IBAction)start {
    [self downloadFile];
}

- (IBAction)stop {
    [self.request clearDelegatesAndCancel];
}

5. 实现下载功能的主要方法。

- (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];
}

对代码中,进度条控制的代码进行解释:它其实利用了代理的setProgress方法与进度条本身的progress属性同名的特点。
self.request.downloadProgressDelegate = self.progressView;

上面一句代码其实等价于

self.request.downloadProgressDelegate = self;
- (void)setProgress:(float)newProgress {
   // NSLog(@"Thread:%@",[NSThread currentThread]);
    self.progressView.progress = newProgress;
}

到此为止,ASI部分的使用介绍就已经完毕了。下一节,我将介绍AFN的使用。

你可能感兴趣的:(ASI使用介绍文件下载)