最近项目里面有个这样的需求,就是当tableview上面的图片全部下载完毕后再去批量下载音频,每个cell上面又有若干个音频,下载过程中还要去沙盒新建文件夹管理这下这些文件,期间有很多细节处理,没有接触到批量下载的同学可能会无从下手,这里分享下我自己封装优化的下载工具和实现思路,让你以后做批量下载变得异常轻松,并且还能监听所有文件下载过程,先来看两张图:
图一 图二对于cell上面的多张图片,设计上应该会给出具体的布局要求,多图九宫格尺寸可以提前计算好 ,并且多图图片大小应该是固定的,但是当cell上面的图片只有一张的图片的时候,在服务器后台没有提供图片尺寸,只能通过单张下载完成后才能知道图片尺寸,如果不等下载完成直接reloaddata,图片异步下载完成后就会出现界面跳动的现象,如果你提前批量把单张图片下载完毕,得到图片尺寸在去刷新,就不会出现界面跳动,图片也不会出现拉伸现象,类似于微博,和朋友圈的cell单张图片摆放,完美无拉伸,但是单张图片的缩略图后台尽量控制大小,不然会下载很久。
接下来看看具体实现方法:
批量下载单张图片介绍下上面的dispatch_group的简单用法:
1.创建了一个图片下载组 取名为 imageGroup
dispatch_group_t imageGroup = dispatch_group_create();
2.添加一个操作或者耗时任务 (这行代码可以放在你的for循环,或者方法,或者下载任务之前,详看截图)
dispatch_group_enter(imageGroup);
3.任务完成之后离开组dispatch_group
dispatch_group_leave(imageGroup)
再来看看下面的一个需求,下图为某个漫画app界面,这个界面是一个tableview实现的,分页加载,每次加载十条数据,每个cell上面只有一张图片,并提供自动播放漫画功能,类似于tableview自动向上滚动,并自动播放语音块,前提是tableview上所有的cell的图片全下载完毕,在去批量下载cell上面的语音块。批量下载图片上面已经介绍过了,有sdwebImage下载图片,在结合dispatch_group监听所有图片下载完成, ,下面的就很简单了,
批量下载语音块// 所有图片下载完成 就会来到下面的block,在block中回调,或者reloaddata
dispatch_group_notify(imageGroup, dispatch_get_main_queue(), ^{
imageSuccessBlock(@"所有图片下载完毕");
};
具体实现:看下图,我保证大家看懂了,以后批量下载只需要处理下下载地址和文件存放路径,其他的基本上都是复制粘贴的:
在这里下载MP3,和其他压缩包等文件推荐:TCBlobDownloadManager,https://github.com/thibaultcha/TCBlobDownload 这个下载工具非常好用,因为他的内部已经为你解决了创建删除文件夹的烦恼,你只需提供你的文件存放路径,如果实在不会管理,TCBlobDownloadManager也为你提供了默认下载路径。
文件下载最后奉上demo:https://github.com/cailingyun2010/CYBatchdownload
网友评论