1.方法一:如果NSData数据很大,把很大的数据装进内存,内存肯定会爆掉,所以这种方法不可取
// 设置url
NSURL *url = [NSURL URLWithString:@"http://localhost/123.jpg"];
// 设置请求
self.request = [ASIHTTPRequest requestWithURL:url];
// 接收到服务器返回的数据
[self.request setDataReceivedBlock:^(NSData *data) {
NSLog(@"-----%d",data.length);
}];
// 发起请求
[self.request startAsynchronous];
2.方法二:
// 设置url
NSURL *url = [NSURL URLWithString:@"http://localhost/123.jpg"];
// 设置请求
self.request = [ASIHTTPRequest requestWithURL:url];
// 设置文件本地存放的路径
NSString *cache = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *cachePath = [cache stringByAppendingPathComponent:@"cache.db"];
[self.request setDownloadDestinationPath:cachePath];
// 下载完成时调用
[self.request setCompletionBlock:^{
NSLog(@"下载完咯,用ASI下载,就是这么轻轻松松搞定!");
}];
// 发起请求
[self.request startAsynchronous];
3. 监听下载的进度,先要遵守ASIProgressDelegate协议
// 设置url
NSURL *url = [NSURL URLWithString:@"http://localhost/123.jpg"];
// 设置请求
self.request = [ASIHTTPRequest requestWithURL:url];
// 设置文件本地存放的路径
NSString *cache = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *cachePath = [cache stringByAppendingPathComponent:@"cache.db"];
[self.request setDownloadDestinationPath:cachePath];
// 设置下载进度代理
self.request.downloadProgressDelegate = self;
// 接收到服务器返回的数据
[self.request setCompletionBlock:^{
NSLog(@"下载完咯");
}];
// 发起请求
[self.request startAsynchronous];
}
#pragma mark - ASIProgressDelegate
- (void)setProgress:(float)newProgress{
NSLog(@"下载进度:%f",newProgress);
}
补充:如果能拿到进度条控件,监听下载进度还有一种写法
self.request.downloadProgressDelegate = self.progressView;
/* 代理方法可以省略不写,因为把self.progressView有progress属性,意味着progressView内部已经实现了progress的set方法,正好downloadProgressDelegate的代理方法就是setProgress: ,所以下面这段代码可以省略
- (void)setProgress:(float)newProgress{
self.progressView.progress = newProgress
} */
4.支持断点续传 [self.request setAllowResumeForFileDownloads:YES]; 把这句代码加上就OK了
原理:假设有个按钮,点击按钮执行这个方法 [self.request clearDelegatesAndCancel];然后ASI会把已经下载好的数据放到沙盒缓存,下次再下载时,会自动将新数据拼接到已下载好的旧数据上.