创建一个ASINetworkQueue全局队列,队列里可以添加请求
- (void)viewDidLoad
{
queue = [[ASINetworkQueue alloc] init];
//设置支持较高精度的进度追踪
[queue setShowAccurateProgress:YES];
//启动
[queue go];
}
紧接着创建我们的下载请求:
- (IBAction)startDownload
{
//Documents路径
NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
//下载路径
downloadPath = [[path stringByAppendingPathComponent:@"A.txt"] retain];
//要支持断点续传,缓存路径是不能少的。
NSString *tempPath = [path stringByAppendingPathComponent:@"A.temp"];
//下载链接
NSURL *url = [NSURL URLWithString:@""];
//创建请求
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
//设置代理,别忘了在头文件里添加ASIHTTPRequestDelegate协议
request.delegate = self;
//设置下载路径
[request setDownloadDestinationPath:downloadPath];
//设置缓存路径
[request setTemporaryFileDownloadPath:tempPath];
//设置支持断点续传
[request setAllowResumeForFileDownloads:YES];
request.downloadProgressDelegate = self;
[queue addOperation:request];
}
//请求开始
- (void)requestStarted:(ASIHTTPRequest *)request;
//请求收到响应的头部,主要包括文件大小信息,下面会用到
- (void)request:(ASIHTTPRequest *)request didReceiveResponseHeaders:(NSDictionary *)responseHeaders;
//请求将被重定向
- (void)request:(ASIHTTPRequest *)request willRedirectToURL:(NSURL *)newURL;
//请求完成
- (void)requestFinished:(ASIHTTPRequest *)request;
//请求失败
- (void)requestFailed:(ASIHTTPRequest *)request;
//请求已被重定向
- (void)requestRedirected:(ASIHTTPRequest *)request;
下面是我们对头部信息的处理
- (void)request:(ASIHTTPRequest *)request didReceiveResponseHeaders:(NSDictionary *)responseHeaders
{
NSLog(@”%@”,responseHeaders);
if (fileLength == 0) {
fileLength = request.contentLength/1024.0/1024.0;
totalPro.text = [NSString stringWithFormat:@"%.2fM",fileLength];
}
}
我们可以从中看到文件大小等一些请求信息,这时request自己也知道了文件大小,所以我们直接使用request的contentLength属性
这是处理进度的方法(request会自动调用该方法):
- (void)setProgress:(float)newProgress
{
progressView.progress = newProgress;
currentPro.text = [NSString stringWithFormat:@"%.2fM",fileLength*newProgress];
}
下面是暂停方法用来测试断点
- (IBAction)pauseDownload
{
//operations方法返回队列里的所有请求,但我们只有一个请求
ASIHTTPRequest *request = [[queue operations] objectAtIndex:0];
//取消请求
[request clearDelegatesAndCancel];
}
队列里只有一个请求。
这里说是暂停,其实request已经完全被取消了!下面说说断点续传
因为开启了断点续传,并且设置了缓存路径,所以request取消时就会在缓存文件里打断点,当我们在次执行上面的startDownload方法时,缓存路径还是之前的缓存路径,request会自动从缓存文件中的断点后开始下载,头部中的文件大小值也是从断点之后开始算的。ASIHTTPRequest已经为你打点好了一切。
继续,当请求完成时,也就是我们的文件已经下载好了的时候,下载好的文件会在我们之前指定的下载路径下生成,同时缓存文件会被删除。