使用NSURLSession
写在前面
NSURLSession是iOS7之后推出的网络操作工具类。主要目的是替换NSURLConnection。
NSURLSession基本使用
//1. 获取NSURLSession对象
NSURLSession *sesion = [NSURLSession sharedSession];
//2. 创建URL
NSURL *url = [NSURL URLWithString:@""];
//3. 创建任务
NSURLSessionDownloadTask *task = [sesion downloadTaskWithURL:url completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
// 1. location->下载完后临时文件的位置,如果不进行任何操作,程序结束后会删除此下载的文件
//将文件剪切到缓冲文件
NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *file = [caches stringByAppendingPathComponent:response.suggestedFilename];
NSFileManager *manager = [NSFileManager defaultManager];
[manager moveItemAtPath:location.path toPath:file error:nil];
NSLog(@"下载完毕%@", response);
}];
//4. 开始任务
[task resume];
NSURELSession代理方式下载
//1. 创建NSURLSessionConfiguration对象
NSURLSessionConfiguration *cfg = [NSURLSessionConfiguration defaultSessionConfiguration];
//2. 创建NSURLSession对象并设置代理<NSURLSessionDownloadDelegate>
NSURLSession *session = [NSURLSession sessionWithConfiguration:cfg delegate:self delegateQueue:[NSOperationQueue mainQueue]];
//3. 创建URL
NSURL *url = [NSURL URLWithString:@""];
//4. 创建下载任务
NSURLSessionDownloadTask *task = [session downloadTaskWithURL:url];
/*
//注意:如果给下载任务设置了completionHandler这个block,也实现了代理方法,优先使用代理方法
NSURLSessionDownloadTask *task = [session downloadTaskWithURL:url completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
}];
*/
//5. 实现下代理方法
NSURLSession常用代理方法
/**
* 完成下载
*
* @param session
* @param downloadTask
* @param location 下载文件的临时路径
*/
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{
//建议文件名
// downloadTask.response.suggestedFilename;
}
/**
* 恢复下载
*
* @param session
* @param downloadTask
* @param fileOffset
* @param expectedTotalBytes
*/
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes{
}
/**
* 下载完一部分时就会调用
*
* @param session
* @param downloadTask
* @param bytesWritten 本次调用写了多少
* @param totalBytesWritten 已经写了多少
* @param totalBytesExpectedToWrite 文件总大小
*/
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{
//下载进度
//(double)totalBytesWritten / totalBytesExpectedToWrite;
}
NSURLSession断点下载
//下载任务对象
@property (nonatomic, strong)NSURLSessionDownloadTask *task;
//暂停下载后返回的数据信息,包含了下载的位置,恢复下载时将此信息传递过去就会接着下载
@property (nonatomic, strong)NSData *resumeData;
//NSURLSession对象
@property (nonatomic, strong)NSURLSession *session;
/**
* 暂停/开始按钮响应事件
*
* @param sender
*/
- (void)btnAction:(UIButton*)sender{
if (self.task == nil) { //如果下载任务为空,开始下载或者恢复下载,否则暂停下载
if(self.resumeData){//如果暂停后返回的信息为空,开始下载,否则恢复下载
[self resume];
}else{
[self start];
}
}else{
[self pause]; //zt
}
}
- (void)resume{
//恢复下载
self.task = [self.sessin downloadTaskWithResumeData:self.resumeData];
[self.task resume];
self.resumeData = nil;
}