iOS NSURLSession 封装下载类
周六日鼓捣NSURLSession,效率虽然低下,最后还是有了一点点眉目。昨天和汤老师一起测试,又对它加深了一点理解。趁热打铁,先总结一下。
封装的类,对外用的方法,我写的是类方法,所以,在类方法中,就不能调用本身的@property变量了。解决办法是:将本身的类先定义为单例,在利用单例将本身的属性方法调用出来。
0.准备工作
工具类必须先遵守DownloadDelegate,同时建立一个session的属性方法
@property(nonatomic, strong)NSURLSession * downloadSession;
1.单例的构造方法:
+(DownloadTool *)instance{ //DownloadTool是当前封装类的名字
static DownloadTool * aInstance = nil;
static dispatch_once_t once_token;
dispatch_once(&once_token, ^{
aInstance = [[DownloadTool alloc]init];
aInstance.downloadDic = [NSMutableDictionary dictionary]; //这个是本身的一个@property属性变量,放在这个里面进行初始化
});
return aInstance;
}
单例构造完成,在类方法里面,我们就可以使用单例来调出属性变量。
2.单一session的构造方法
/**
* 创建session
*/
- (NSURLSession *)isDownloadSession{
if (!_downloadSession) {
NSString * configurationStr = @"DownloadTool";
NSURLSessionConfiguration * sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:configurationStr];
NSURLSession * downloadSession = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:self delegateQueue:[NSOperationQueue mainQueue]];
_downloadSession = downloadSession; //_downloadSession是前面定义的属性方法
}
return _downloadSession;
}
session用configuration来唯一标示,可以用identifier来唯一标识,和其他的不同的session来区分,如果整个项目的session用的是同一个的话,可以用shareSession单例。代理设置为self,Queue,一般设置为主线程。
3.开始下载--这个可以定义类的调用方法里面,自己定义,同时将URL传入进来即可
if ([[DownloadTool instance]isDownloadSession]) {
NSURLSessionDownloadTask * downloadTask = [[DownloadTool instance].downloadSession downloadTaskWithURL:[NSURL URLWithString:url]];
downloadTask.taskDescription = @"downloadTask01";
[downloadTask resume];
}
3.1 先建立一个downloadTask,用唯一的session来启动,传入具体的URL。
3.2 taskDescription,可以用来描述下载任务,这个属性是可以修改的,与taskIdentifier不同,taskIdentifier是由系统返回是,一般用数字来标识,可用性不高,我们可以把对下载任务的描述,唯一标识符等,放在taskDescription里面,到后面代理方法里面,可以根据downloadTask.taskDescription将这个值取出来
3.3 resume:启动下载;必须调用这个方法,才会启动下载,否则不会。当然还有其他的方法,比如暂停、取消。
4.实现代理方法
4.1 下载完成
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{
//建立一个文件夹
BOOL isDirectory;
NSString * folderPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]stringByAppendingString:@"/script"];
BOOL isExistFolderPath = [[NSFileManager defaultManager]fileExistsAtPath:folderPath isDirectory:&isDirectory];
if (!isExistFolderPath) {
BOOL createFile = [[NSFileManager defaultManager]createDirectoryAtPath:folderPath withIntermediateDirectories:YES attributes:nil error:nil];
if (createFile) {
NSLog(@"创建文件成功");
}else{
NSLog(@"创建文件失败");
}
}
//改变位置
NSString * sourcePath = location.path;
NSString * lastComponent = scScript.url.lastPathComponent;
NSString * destinationPath = [folderPath stringByAppendingPathComponent:lastComponent];
[[NSFileManager defaultManager]moveItemAtPath:sourcePath toPath:destinationPath error:nil];
//保存到数据库
[[DownloadStoreManager sharedInstance]insertScript:scScript];
//发送消息
NSDictionary * dic = @{@"script":scScript};
[[NSNotificationCenter defaultCenter]postNotificationName:DownloadNotificationName object:nil userInfo:dic];
NSLog(@"下载成功------");
}
这个是下载完成比较早的一个方法,后面还有一个方法。
在这个方法里面,会将下载到的文件,暂时放置temp文件里面,如果我们不处理,系统稍后会把这个文件给清除掉,所以,在这个里面,我们的任务之一,就是把文件移动到目标文件夹里面去。如果目标文件不存在,我们要创建一个文件夹。后面,有可能要存入到数据库里面,这个依业务来定。最后发送消息:DownloadNotificationName是我定义的消息的名称,这个可以依具体情况而定。
3.2 数据下载完成的第二个方法
//下载完成
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didCompleteWithError:(NSError *)error{ if (error) {
NSDictionary * dic = @{@"error":@"下载失败"};
[[NSNotificationCenter defaultCenter]postNotificationName:DownloadNotificationName object:nil userInfo:dic];
} }
一开始,我被这个方法名字给误导了,以为只有下载失败的时候才会调用这个方法,其实不是的,这个是在任务完成,不管是成功或者失败,都是要调用的一个方法。如果error为null,则说明下载成功,如果error有值,则下载失败,通过error这个值来判别。
当前NSURLSession里面,还有很多其他的方法,比如下载Data、upload上传,原理差不多。
今天先总结到这。昨天晚上太晚了,就没写总结,今天早上补上。
最近来接触新事物时,脑袋刚开始时,总是蒙蒙的,看来得多接受新事物才能调节啊!
iOS NSURLSession 封装下载类的更多相关文章
- iOS7 中的新加入的下载类NSURLSession(随ios版本更新而更新)
想详细的了解网络下载的相关知识,要仔细阅读URL Loading System Programming Guide 这里有篇好文章(http://www.shinobicontrols.com/blo ...
- iOS开发——网络篇——NSURLSession,下载、上传代理方法,利用NSURLSession断点下载,AFN基本使用,网络检测,NSURLConnection补充
一.NSURLConnection补充 前面提到的NSURLConnection有些知识点需要补充 NSURLConnectionDataDelegate的代理方法有一下几个 - (void)conn ...
- iOS 自己封装的网络请求,json解析的类
基本上所有的APP都会涉及网络这块,不管是用AFNetWorking还是自己写的http请求,整个网络框架的搭建很重要. 楼主封装的网络请求类,包括自己写的http请求和AFNetWorking的请求 ...
- ios 网络数据下载和JSON解析
ios 网络数据下载和JSON解析 简介 在本文中笔者将要给大家介绍ios中如何利用NSURLConnection从网络上下载数据,如何解析下载下来的JSON数据格式,以及如何显示数据和图片的异步下载 ...
- iOS Foundation 框架基类
iOS Foundation 框架基类 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转 ...
- Asp.Net Core 2.0 项目实战(6)Redis配置、封装帮助类RedisHelper及使用实例
本文目录 1. 摘要 2. Redis配置 3. RedisHelper 4.使用实例 5. 总结 1. 摘要 由于內存存取速度远高于磁盘读取的特性,为了程序效率提高性能,通常会把常用的不常变动的数 ...
- WorldWind源码剖析系列:网络下载类WebDownload
网络下载类WebDownload封装了对请求的瓦片进行网络下载的相关操作.该类使用了两个委托类型和一个枚举类型. 该类的类图如下. 网络下载类WebDownload各个字段和属性的含义说明如下: st ...
- PHPEXCEL在thinkphp中封装成类使用
PHPEXCEL在thinkphp中封装成类使用 标签: phpexcel导出导入thinkphp -- : 435人阅读 评论() 收藏 举报 分类: php() 版权声明:本文为博主原创文章,未经 ...
- 使用AFNetworking第三方下载类
AFNetworking 眼下使用比較多得一个下载库 眼下一直在维护更新,使用的是很easy 不须要加入不论什么关联的库 1.带block形式 内部是任务队列进行下载 就是对operation的一 ...
随机推荐
- TYVJ P1073 加分二叉树 Label:区间dp
背景 NOIP2003 提高组 第三道 描述 设一个n个节点的二叉树tree的中序遍历为(l,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第j个节点的 ...
- PHP文件漏桐可以通过对服务器进行设置和配置来达到防范目的
对脚本执行漏洞的防范 黑客利用脚本执行漏洞进行攻击的手段是多种多样的,而且是灵活多变的,对此,必须要采用多种防范方法综合的手段,才能有效防止黑客对脚本执行漏洞进行攻击.这里常用的方法方法有以下四种.一 ...
- 【新产品发布】【EVC8001 磁耦隔离式 USB 转 RS-485】
EVC8001 是 XiaomaGee 团队打造的精品级 USB 转 RS-485 隔离转换器,全部采用最优方案,每个细节均做到最优化.最佳化.亮点举不胜举: ==================== ...
- HDU 1078 FatMouse and Cheese(记忆化搜索)
FatMouse and Cheese Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- PAT天梯赛练习题 L3-011. 直捣黄龙(多关键字SPFA+DFS)
L3-011. 直捣黄龙 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题是一部战争大片 —— 你需要从己方大本营出发,一路 ...
- UVALive 7297 bfs
题意 一个小偷偷到了项链 他想知道自己是否可以逃出去 地图中有一个小偷 一个警察 警察有一条狗 一开始 小偷和警察的移动速度都是1 当警察走到小偷经过过的地方时 警察会有一条狗嗅到小偷的气味并且以2的 ...
- 不再以讹传讹,GET和POST的真正区别
不再以讹传讹,GET和POST的真正区别 网上的多数答案都是错的 在 2012年05月03日 那天写的 已经有 19940 次阅读了 感谢 参考或原文 www.cnblogs.com 服务 ...
- JavaScript 数组详解(转)
在程序语言中数组的重要性不言而喻,JavaScript中数组也是最常使用的对象之一,数组是值的有序集合,由于弱类型的原因,JavaScript中数组十分灵活.强大,不像是Java等强类型高级语言数组只 ...
- 基于s5pv210的uboot总结
1.启动过程特征总结 (1)第一阶段为汇编阶段.第二阶段为C阶段 (2)第一阶段在SRAM中.第二阶段在DRAM中 (3)第一阶段注重SoC内部.第二阶段注重SoC外部Board内部 2.uboot的 ...
- THE ARCHITECTURE OF COMPLEXITY HERBERT A. SIMON* Professor of Administration, Carnegie Institute of Technology (Read April 26, 1962)
THE ARCHITECTURE OF COMPLEXITY HERBERT A. SIMON* Professor of Administration, Carnegie Institute of ...