1. 首先明确我们要一个单例类来写下载功能,这里使用NSURLSessionDownloadTask这个下载类实现下载
a.使用NSURLSessionDownloadTask需要使用其父类NSURLSession来支持与初始化
b.父类初始化方法中sessionWithConfiguration的参数可以填nil,也可以给[NSURLSessionConfiguration defaultSessionConfiguration]来给默认值(方法)
c.delegate给自身类去操作遵循过代理之后执行下载完毕转存文件的操作
遵从协议< NSURLSessionDownloadDelegate >d.delegateQueue给主线程并不代表是放在主线程去执行下载,而是开辟线程执行下载,下载完毕后回到主线程去刷新
e.用NSURLSessionDownloadTask创建的对象根据传入的url执行下载与暂停功能
@interface DownloadSong : NSObject<NSURLSessionDownloadDelegate>
//下载类
@property (nonatomic, strong) NSURLSessionDownloadTask *downloadTask;
- (void)downloadWithUrl:(NSString *)url fileName:(NSString *)fileName
{
self.fileName = fileName;
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
//执行下载
self.downloadTask = [session downloadTaskWithURL:[NSURL URLWithString:url]];
//开始下载,或继续下载,对应suspend(暂停)
[self.downloadTask resume];
}
2.NSURLSession代理方法的实现
a.代理方法为NSURLSession的代理,下载后走该方法
b.我们内部使用它的时候需要将下载好的文件以.MP3的格式转存值Library/Caches的路径,否则下载完毕之后系统会直接删除
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
{
//获取缓存路径
NSString *caches=[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES ) lastObject];
NSString *fileName = [[caches stringByAppendingPathComponent:self.fileName] stringByAppendingString:@".mp3"];
//创建文件管理工具类
NSFileManager *maneager = [NSFileManager defaultManager];
//将文件转存至我们设定的路径下
[maneager moveItemAtPath:location.path toPath:fileName error:nil];
self.fileUrl = fileName;
//下载完毕后安全处理将downloadTask置为空
self.downloadTask = nil;
[[NSNotificationCenter defaultCenter] postNotificationName:@"download" object:nil];
}
3.该下载类的使用方法
a.外部调用时,用以下方法调用
[[DownloadSong shareDownload] downloadWithUrl:文件地址 fileName:文件名];
b.添加一个通知用来接收下载完成方法,以便于我们在外部使用,如:下载完毕后使用,某一个页面使用存储信息,存入数据库等等
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(downloadOK) name:@"download" object:nil];