ASIHTTPRequest和ASINetworkQueue实现队列下载并查看结果

ASIHTTPRequest是一个很常见的网络请求开源框架,虽然博主声明已经不更新,但目前来看依旧可以满足大部分需求。ASIHTTPRequest负责单独文件的下载,存储在iOS的文件系统中,比如Document目录下或者Cache目录。

ASINetworkQueue是下载队列,里面添加很多的单独的ASIHTTPRequest下载任务,可以更好的管理多个下载请求。

这里记录ASIHTTPRequest和ASINetworkQueue两者一起实现一个下载队列任务,按顺序依次下载很多首歌曲到Cache目录。

初始化队列

//初始化队列

ASINetworkQueue *networkQueueForSong = [[ASINetworkQueue alloc] init];

[networkQueueForSong reset];

//初始化待下载数组

NSMutableArray *toDownLoadFiles=[NSMutableArray arrayWithObjects:@"www.test1.com/song1.mp3",@"www.test1.com/song2.mp3",@"www.test1.com/song3.mp3", nil];

//下载队列代理方法

[networkQueueForSong setRequestDidFailSelector:@selector(singleDownLoadFail:)];

[networkQueueForSong setRequestDidFinishSelector:@selector(singleDownloadFinished:)];

[networkQueueForSong setRequestDidReceiveResponseHeadersSelector:@selector(downLoadReceiveResponseHeader:)];

[networkQueueForSong setRequestDidStartSelector:@selector(singleDownLoadStart:)];

[networkQueueForSong setQueueDidFinishSelector:@selector(downLoadFinish)];

[networkQueueForSong setDelegate:self];

//设置下载队列属性,设置为1只允许下完一首再下另一首,默认是并行下载不分前后

[networkQueueForSong setMaxConcurrentOperationCount:1];

这里networkQueueForSong为初始化的队列,然后初始化了toDownLoadFiles这个下载资源的数组,里面是三首歌儿的示例url。队列的代理方法其实和单独的ASIHTTPRequest下载代理方法一样,比如setRequestDidFinishSelector这个方法的作用就是单独的每个下载完成的时候回调函数,在队列里设置了,下载就不需要单独设置了。最后ASINetworkQueue有一些自己的属性,比如常用的同时下载的数量设定,具体用法注释有写。

添加下载请求

  //添加下载请求

for (int i=0; i<toDownLoadFiles.count; i++) {

NSURL *url=[NSURL URLWithString:[toDownLoadFiles objectAtIndex:i]];

ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:url];

NSString *savePath=[NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"];

[request setDownloadDestinationPath:[savePath stringByAppendingPathComponent:[NSString stringWithFormat:@"offLineSong%@.mp3",i]]];

[request setShouldContinueWhenAppEntersBackground:YES];

[request setUserInfo:[NSDictionary dictionaryWithObject:[NSString stringWithFormat:@"songRequest"] forKey:@”name”]];

[request setTimeOutSeconds:120];

[request setNumberOfTimesToRetryOnTimeout:3];

[request setDelegate:self];

[networkQueueForSong addOperation:request];

}

添加下载请求是具体的每个下载内容的设置,这里需要设置下载路径Library/Caches,对于App的离线文件,这个是存储的路径,而不是Document需要注意,否则很可能被拒。方法setShouldContinueWhenAppEntersBackground顾名思义就是允许后台下载。对于下载时网络环境不好可能出现的复杂情况可以用setTimeOutSeconds这个方法来设置超时时间,超过这个时间才会被认定为失败,这里设置了2分钟,那么这个下载请求就会持续2分钟不被认为失败,如果失败了,方法setNumberOfTimesToRetryOnTimeout会规定重试几次。最后将这个下载的请求添加的队列networkQueueForSong中去。

在单个下载完成的代理方法里可以通过下面的方法记录下载完成的路径:

NSString *localPath=[request downloadDestinationPath];

开始下载

[networkQueueForSong go];

这样下载队列开始执行,会按照添加的顺序一个一个的下载,失败了重试三次,每个单独的下载,整个队列的下载都会有代理方法。

查看结果

如果越狱用户或者是模拟器可以直接通过工具或者命令行进入到Library/Caches查看下载是否成功,看看有没有下载的文件。如果没越狱的机器就没这个权限看了,可以通过NSFileManager打印出Library/Cache目录下内容来查看

//打印目录下文件

-(void)printOffLinePath{

//在这里获取应用程序Documents文件夹里的文件及文件夹列表

NSFileManager *fileManager = [NSFileManager defaultManager];

NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);

NSString *documentDir = [documentPaths objectAtIndex:0];

NSError *error = nil;

NSArray *fileList = [[NSArray alloc] init];

//fileList便是包含有该文件夹下所有文件的文件名及文件夹名的数组

fileList = [fileManager contentsOfDirectoryAtPath:documentDir error:&error];

NSLog(@” array %@”,fileList);

}

NSFileManager不仅仅是这个用途,它负责管理iOS的文件系统,比如需要删除的时候:

 NSFileManager *defaultManager = [NSFileManager defaultManager];

[defaultManager removeItemAtPath:removeImgPath error:nil];

如果需要知道下载路径文件夹下文件的总大小,可以通过这个方法:

//计算路径下文件大小

-(float)currentOffLineSize{

NSString *savePath=[NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"];

NSFileManager *filemgr;

NSArray *filelist;

int count;

float cacheSize = 0;

filemgr =[NSFileManager defaultManager];

filelist = [filemgr contentsOfDirectoryAtPath:savePath error:NULL];

count = [filelist count];

for (NSString *url in filelist) {

NSData *data = [filemgr contentsAtPath:[NSString stringWithFormat:@"%@/%@",savePath,url]];

cacheSize = cacheSize + ([data length]/1000);

}

cacheSize = (cacheSize/1024);

return cacheSize;

}

相关推荐
<p> <b><span style="font-size:14px;"></span><span style="font-size:14px;background-color:#FFE500;">【Java面试宝典】</span></b><br /> <span style="font-size:14px;">1、68讲视频课,500道大厂Java常见面试题+100个Java面试技巧与答题公式+10万字核心知识解析+授课老师1对1面试指导+无限次回放</span><br /> <span style="font-size:14px;">2、这门课程基于胡书敏老师8年Java面试经验,调研近百家互联网公司及面试官的问题打造而成,从筛选简历和面试官角度,给出能帮助候选人能面试成功的面试技巧。</span><br /> <span style="font-size:14px;">3、通过学习这门课程,你能系统掌握Java核心、数据库、Java框架、分布式组件、Java简历准备、面试实战技巧等面试必考知识点。</span><br /> <span style="font-size:14px;">4、知识点+项目经验案例,每一个都能做为面试的作品展现。</span><br /> <span style="font-size:14px;">5、本课程已经在线下的培训课程中经过实际检验,老师每次培训结束后,都能帮助同学们运用面试技巧,成功找到更好的工作。</span><br /> <br /> <span style="font-size:14px;background-color:#FFE500;"><b>【超人气讲师】</b></span><br /> <span style="font-size:14px;">胡书敏 | 10年大厂工作经验,8年Java面试官经验,5年线下Java职业培训经验,5年架构师经验</span><br /> <br /> <span style="font-size:14px;background-color:#FFE500;"><b>【报名须知】</b></span><br /> <span style="font-size:14px;">上课模式是什么?</span><br /> <span style="font-size:14px;">课程采取录播模式,课程永久有效,可无限次观看</span><br /> <span style="font-size:14px;">课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化</span><br /> <br /> <br /> <span style="font-size:14px;background-color:#FFE500;"><strong>如何开始学习?</strong></span><br /> <span style="font-size:14px;">PC端:报名成功后可以直接进入课程学习</span><br /> <span style="font-size:14px;">移动端:<span style="font-family:Helvetica;font-size:14px;background-color:#FFFFFF;">CSDN 学院APP(注意不是CSDN APP哦)</span></span> </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页