如何利用GCD Group批量下载文件

ios urlsession 同时下载多个文件缓存到本地(非afn) 同时下载6个请求然后缓存到cache文件夹,非afn ,代码量很少,很轻, 使用的是ios的urlsession,用来提升缓存速度,提升响应时间。详情效果请看 https://blog.youkuaiyun.com/github_35041937/article/details/83304516 立即下载

未命名未命名

小引:有时候,我们在开发iOS程序时,需要批量下载一些文件(比如图片),只有当全部文件下载完毕,我们才做相应的处理(界面更新,通知用户等)——也就是说虽然有多个文件在下载,但是我们只需要收到一个全部下载完毕的通知。

在网上搜索了一番,感觉使用GCD的高级功能Group,比较方便。下面写了一个小Demo,实现了多个图片文件的异步并发下载,缓存到本地,并显示到界面中。

参考了唐巧的一篇博文:使用GCD。

另外感兴趣的同学可以看看下面几篇GCD相关文章,非常不错:

raywenderlich:Multithreading and Grand Central Dispatch on iOS for Beginners Tutorial

苹果官网:Grand Central Dispatch (GCD) Reference 和 Concurrency Programming Guide

Demo可以到Github上下载:

 https://github.com/BeyondVincent/DownloadImage_GCD

下面是使用GCD Group的关键代码:

- (IBAction)downloadAction:(UIButton *)sender
{
    [self resetImage];
    self.status.text = @"正在下载";
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_t downloadImage = dispatch_group_create();

    for (ImageInfo *info in self.imageList) {
        NSString* imagePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:info.imageName];

        NSFileManager *fileManager = [NSFileManager defaultManager];
        // 如果本地不存在图片,则从网络中下载
        if (![fileManager fileExistsAtPath:imagePath]) {
            dispatch_group_async(downloadImage, queue, ^{
                NSLog(@"Starting image download:%@", imagePath);
                // URL组装和编码
                NSString *urlString = [NSString stringWithFormat:@"%@/%@", self.baseUrl, info.imageName];
                NSURL *url = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
                NSLog(@"image download from url:%@", urlString);

                // 开始下载图片
                NSData *responseData = [NSData dataWithContentsOfURL:url];
                // 将图片保存到指定路径中
                [responseData writeToFile:imagePath atomically:YES];
                // 将下载的图片赋值给info
                info.image = [UIImage imageWithData:responseData];
                NSLog(@"image download finish:%@", imagePath);
            });
        } else { // 将本地图片加载到systemInfo.MyImage
            info.image = [UIImage imageWithData:[NSData dataWithContentsOfFile:imagePath]];
        }
    }
    dispatch_group_notify(downloadImage, dispatch_get_main_queue(), ^{
        // 图片加载完毕之后,显示出来
        self.status.text = @"图片文件下载并缓存完毕";
        [self showImage];
    });
}

上面关键的代码是dispatch_group_async(并行执行线程1)和dispatch_group_notify(全部下载完毕,由此进行回调通知)。在for语句中循环开启了6个并发任务。当6个任务完成之后,调用showImage方法,将图片显示出来。
下面是运行效果图(第一个图为程序刚刚启动时的效果,第二个为点击开始异步下载图片按钮之后的效果):
QQ20130502-3QQ20130502-3

QQ20130502-2QQ20130502-2
 

在写本Demo的时候,遇到了以下两个问题

  1. 关于图片的加载,UIImage中的imageNamed:方法只能加载程序main bundle中的图片。要想加载Document中的图片,需要使用UIImage的imageWithData方法。更多相关资料可以阅读苹果官方介绍:UIImage
  2. NSURL URLWithString:myString returns Nil。在初始化NSURL实例对象是,一直都返回Nil。后来在这里(Here)发现原来是URL中含有特殊字符,需要进行编码处理,照着链接中的方法搞定。

_________________

本文由破船原创
转载请注明出处:BeyondVincent的博客
_________________

ios多文件编程 ios多文件编程用法: 作用:保存应用的信息,软件名称、版本号等等,相当于身份证 Bundle name:程序名称,不能超过12个字节 Bundle versions string, short:APP版本号 Bundle identifier:APP项目唯一标识 Bundle version:内部开发人员使用的版本号 Main storyboard file base name:第一启动的storyboard文件 注意:图形化的Info.plist文件上面的KEY不是真实的KEY,要想看真实的KEY得看Info.plist文件的源码 操作:Info.plist(选中后右键单击) -> Open As -> Source Code 立即下载

相关推荐

ios-文件批量下载.zip

分为直接开始下载和先读取总长度再进行下载,回调使用为Block,使用简单,不与其他第三方冲突

ios 后台多文件下载

后台下载花了很长时间最终还是完成了后台用urlsession来下载任务使用nsoperation的子类来管理nsoperationqueue 来控制最大并发添加下载的时候将下载任务名添加到数组将数组写入沙盒并给每个下载任务添加一个模型 写入沙盒包含下载的信息进入下载管理界面就是会从沙盒中读取任务列表再读取每个任务对应的模型根据 任务当前下载的长度 和总共需要下载的长度判断任务的状态 再继续进行下载。

github_35041937的博客 1515

ios-ios多文件下载,后台下载,队列下载,断点下载.zip

本代码主要是管理下载任务。提供了最基础的下载服务。 最新代码请到我的github上下载 https://github.com/agelessman/MCDownloadManager

iOS技术之批量下载

批量下载, 是一种很常见的技术.特别是一些视频软件最常见.掌握这项技术对开发有很大的帮助. 下面就让我来给你慢慢介绍, 帮助你快速成为开发大神. 就比如说想点击电影列表进入下载任务当中. 具体步骤如下: 1.利用了第三方 AFNetworking 文件, 通过 cocoPods, 先将其导入进来.在(1)电影页面利用, AFHTTPURLSessionManager 去发起 get 请求.并

qq_32780047的博客 1684

GCD+NSURLSession文件下载

此项目为一个示例项目,主要是实现GCD的多线程异步下载

当兵心理测试软件,当兵心理测试题及答案

心理测试是一种比较先进的测试方法,它是指通过一系列手段,将人的某些心理特征数量化,来衡量个体心理因素水平和个体心理差异差异的一种科学测量方法。小编为你整理了当兵心理测试题及答案,希望对你有所参考帮助。征兵心理测试题(1代表是2代表否)1、我的胃口很好。12、我早上起来的时候,多半觉得睡眠充足,头脑清醒13、我喜欢看报纸上的犯罪新闻。14、有时我常感到困难重重,无法克服。25、我时常遇见一些所谓的专...

weixin_42128393的博客 1万+

[iOS 多线程 & 网络 - 2.4] - 大文件下载 (边下边写/暂停恢复下载/压缩解压zip/多线程下载)...

A.需求 边下边写入硬盘 显示下载进度 暂停/恢复 下载 解压文件 多线程下载 B.基本知识 1.小文件下载 如果文件比较小,下载方式会比较多直接用NSData的+ (id)dataWithContentsOfURL:(NSURL *)url;利用NSURLConnection发送一个HTTP请求去下载如果是下载图片,还可以利用SDWebImage框架 ...

daxiguan0304的博客 287

VSLAM框架对比

格VSLAM特点介绍: (一)ORB-SLAM2 (二)ORB-SLAM3 (三)LSD-SLAM (四)

ljtx200888的博客 2294

iOS中使用GCD中的Group管理子线程

之前的项目中有用到SDWebimage缓存图片,当图片只有一张的时候,无所谓,在回调的方法中直接调用即可,但是如果是多张图片的话,这个时候不知道哪个线程先完成,因为SDWebimage下载一张图片是开一个子线程,多张的话就多张子线程,如果我们需要在所有下载完成之后再进行回调,这个时候需要用到GCD中的Group知识点,会在所有的子线程完成之后给一个回调,这个时候就实现了之前的需求,步骤如下: 1

June的专栏 1783

python后端的支付宝小程序用户认证问题(alipay-sdk-python、pycrypto无法安装)

python后端的支付宝小程序用户认证问题(alipay-sdk-python、pycrypto无法安装) 写在前面 事先说明,本人不是大佬,我只是在不断探索的途中找到了解决这个问题的方法,之前在网上搜索的时候没有看到相关文章,所以就来简单讲一下。 正文 借着蚂蚁金服小程序大赛开通了支付宝小程序个人开发者,尝试将一个微信小程序的项目移植到支付宝上,支付宝对于用户唯一id的获取比微信要复杂很多,微信...

weixin_43102379的博客 3642

Rockchip平台Android相机HAL3开发实战:从配置到调试全流程解析

本文深入解析了Rockchip平台Android相机HAL3的开发全流程。从理解AAL与PSL核心架构、解析关键配置文件(如camera3_profiles.xml和Tuning文件),到搭建编译环境、进行增量部署,并提供了系统日志分析、V4L2调试等高级问题排查技巧,为开发者提供了一套从配置到调试的实战指南。

docker7nomad的博客 844

GCD中的dispatch_group函数的详解

1、引入dispatch_group函数的目的在追加到dispatch_Queue中的多个处理全部结束后想要执行结束的处理,这种需求经常会在我们的程序中出现。(第一种情况)只使用一个Serial Dispatch Queue时,只要将想要执行的操作全部追加到串行队列,并在最后执行结束的操作即可实现(第二种情况)当我们使用Concurrent Dispatch Queue时或者使用多个Dispatch

Benson的学习笔记 3932

kbjdbc: autodetected server-encoding to be ISO-8859-1, if the message is not readable, please check

这条信息是来自 KingbaseES 数据库的一个 JDBC 客户端连接提示。KingbaseES 是一个企业级的关系型数据库管理系统,它兼容 PostgreSQL 的许多特性。如果上述步骤仍然无法解决问题,建议详细查看数据库和客户端的日志文件,以获取更具体的错误信息。此外,也可以考虑联系 KingbaseES 的技术支持获取帮助。项目融合kingbase数据库,输出日志乱码。结果:网上各种调整各种试。

zjy660358的专栏 4843

GCD-Group

GCD把多个任务(下载图片)打包成一个组Group, 调用group_notify, 可以做其他的事情.#import "ViewController.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; //全局队列+异步执行

John_Fighting的博客 415

2025国赛数学建模A题 完整Python代码 烟幕干扰弹的投放策略

常量定义G = 9.8 # 重力加速度 m/s²V_SMOKE_SINK = 3 # 烟幕下沉速度 m/sMISSILE_SPEED = 300 # 导弹速度 m/sEFFECTIVE_RADIUS = 10 # 有效遮蔽半径 mEFFECTIVE_DURATION = 20 # 有效遮蔽时间 sTARGET_POS = np.array([0, 200, 0]) # 目标位置FALSE_TARGET_POS = np.array([0, 0, 0]) # 假目标位置# 初始位置。

YOLO 1106

SAP-ABAP:ABAP Development Tools(ADT)安装配置学习分享教程-第一篇:ADT安装前置准备与环境校验教程

ABAP Development Tools(ADT)安装配置教程摘要 本文是ADT安装系列的第一篇,重点讲解环境准备与版本校验。ADT是基于Eclipse的现代ABAP开发工具,相比传统SAP GUI提供更智能的开发体验。安装前需确认: 推荐使用Eclipse 2026-03 + Java 21组合 操作系统需Windows 10+/macOS 14+ SAP GUI版本要求Windows≥8.00/macOS≥8.10 后端系统需NetWeaver 7.31 SP04+或S/4HANA 通过java -

baidu_35680696的博客 686

完整详解GCD系列(三)dispatch_group

完整详解GCD系列三,详细的阐述了dispatch_group的常用方法,通过实例解析如何使用。并且实例解析了dispatch_group_enter/dispatch_group_leave。提供了三个完整的实例代码

Leo的专栏 9758

第4章--CANoe library开发 - 诊断功能

因为专栏要做的是汽车ECU自动化测试程序,测试的是ECU的诊断和刷新,因此就需要利用CANoe的接口,开发一些方便使用的诊断报文收发函数。

j187067046的博客 1398

ios多线程GCD group

1 #import "HMViewController.h" 2 3 @interface HMViewController () 4 @property (weak, nonatomic) IBOutlet UIImageView *imageView1; 5 @property (weak, nonatomic) IBOutlet UIImageVi...

diren5694的博客 115

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

IOS GCD图片数据异步下载,下载完成后合成显示

  关于GCD使用详解,请看我的上一篇blog:http://www.cnblogs.com/xin-lang/p/6278606.html   前段时间遇到个需要异步下载,下载完成后再组合显示的东西。这里我采用了 dispatch_group_create()来实现。废话不多说,一言不合就上代码: //创建GCD队列 dispatch_group_t grou...

198

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

GCD中dispatch_group的使用方法

在实际开发中,我们经常会遇到这样的问题:有几个不同的任务,当所有任务完成后需要根据这些任务的结果去执行下一步操作(例如:下载多张图片,全部下载后进行拼接并显示出来)。我们利用上边刚刚讲过的 dispatch_barrier 方法或许可以达到此类目的,但下边要讲的 dispatch_group 相关方法才更适合解决类似问题。 在编写测试代码之前,我们还要了解一下 dispatch_group_not...

毛毛虫 1992

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

GCD group在多个网络请求的响应之前就已经执行

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33797791的博客 138

iOS GCD之dispatch_group的使用(多个文件并发上传)

NSMutableArray *imageURLs= [NSMutableArray array]; dispatch_group_t group = dispatch_group_create(); // 1 for (UIImage *image in images) { dispatch_group_enter(group);

Quinn's blog ! I'm glad to be here! 2529

GCD的用法总结

1 、最常用的一个:  耗时操作放到子线操作,刷新UI等操作返回主线程中   dispatch_async(dispatch_get_global_queue(0, 0), ^{         NSURL * url = [NSURL URLWithString:@"https://www.baidu.com/img/bdlogo.png"];         NSDat

Lw_Chen的博客 963
上一篇: 使用GCD
下一篇: TCP/IP、Http的区别
vic__vic
博客等级 码龄15年 3粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值