使用NSURLSession实现下载类的封装

来源:互联网 发布:苏联数学 知乎 编辑:程序博客网 时间:2024/05/17 09:23

 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 = [NSURLSessionsessionWithConfiguration:[NSURLSessionConfigurationdefaultSessionConfiguration] delegate:selfdelegateQueue:[NSOperationQueuemainQueue]];

    //执行下载

    self.downloadTask = [sessiondownloadTaskWithURL:[NSURLURLWithString:url]];

    //开始下载,或继续下载,对应suspend(暂停)

    [self.downloadTaskresume];

    

}


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 = [[cachesstringByAppendingPathComponent:self.fileName]stringByAppendingString:@".mp3"];

    //创建文件管理工具类

    NSFileManager *maneager = [NSFileManagerdefaultManager];

    //将文件转存至我们设定的路径下

    [maneager moveItemAtPath:location.pathtoPath:fileName error:nil];

    self.fileUrl = fileName;

    //下载完毕后安全处理将downloadTask置为空

    self.downloadTask =nil;

    [[NSNotificationCenterdefaultCenter] postNotificationName:@"download"object:nil];


}

3.该下载类的使用方法


a.外部调用时,用以下方法调用

 [[DownloadSong shareDownload] downloadWithUrl:文件地址 fileName:文件名];

b.添加一个通知用来接收下载完成方法,以便于我们在外部使用,如:下载完毕后使用,某一个页面使用存储信息,存入数据库等等

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(downloadOK) name:@"download" object:nil];

 









8 0
原创粉丝点击