NSURLSession实现下载(代理)
- (void)downloadTask2
{
NSURLSessionConfiguration *cfg = [ NSURLSessionConfiguration defaultSessionConfiguration ];
// 1. 得到 session 对象
NSURLSession *session = [ NSURLSession sessionWithConfiguration :cfg delegate : self delegateQueue :[ NSOperationQueue mainQueue ]];
// 2. 创建一个下载 task
NSURL *url = [ NSURL URLWithString : @"http://localhost:8080/MJServer/resources/test.mp4" ];
// NSURLSessionDownloadTask *task = [session downloadTaskWithURL:url completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
// NSLog(@"%@",location);
// }];
NSURLSessionDownloadTask *task = [session downloadTaskWithURL :url];
// 3. 开始任务
[task resume ];
// 如果给下载任务设置了 completionHandler 这个 block ,也实现了下载的代理方法,优先执行 block
}
注意:
NSURLSessionDownloadTask下载完成之后,将数据保存在沙盒里面的tmp临时文件中,需要将临时文件
将临时文件剪切或者复制
Caches
文件夹。
#pragma mark - NSURLSessionDownloadDelegate
/**
* 下载完毕后调用
*
* @param location 临时文件的路径(下载好的文件)
*/
- ( void )URLSession:( NSURLSession *)session downloadTask:( NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:( NSURL *)location
{
// location : 临时文件的路径(下载好的文件)
NSString *caches = [ NSSearchPathForDirectoriesInDomains ( NSCachesDirectory , NSUserDomainMask , YES ) lastObject ];
// response.suggestedFilename : 建议使用的文件名,一般跟服务器端的文件名一致
NSString *file = [caches stringByAppendingPathComponent :downloadTask. response . suggestedFilename ];
// 将临时文件剪切或者复制 Caches 文件夹
NSFileManager *mgr = [ NSFileManager defaultManager ];
// AtPath : 剪切前的文件路径
// ToPath : 剪切后的文件路径
[mgr moveItemAtPath :location. path toPath :file error : nil ];
}
/**
* 恢复下载时调用
*/
- ( void )URLSession:( NSURLSession *)session downloadTask:( NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:( int64_t )fileOffset expectedTotalBytes:( int64_t )expectedTotalBytes
{
}
/**
* 每当下载完(写完)一部分时就会调用(可能会被调用多次)
*
* @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 progress = ( double )totalBytesWritten / totalBytesExpectedToWrite;
NSLog ( @" 下载进度 ---%f" , progress);
}