多线程并发流程控制之dispatch_group 有关函数

A B C D 4个并发下载任务,怎样在第一时间知道任务全部完成?

dispatch_group 可以帮我们实现这样的控制。

上代码,看说明.

[objc] view plain copy

  1. dispatch_group_t group = dispatch_group_create();
  2. // 某个任务放进 group
  3. dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
  4. // 任务代码1
  5. });
  6. dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
  7. // 任务代码2
  8. });
  9. dispatch_group_notify(group, dispatch_get_main_queue(), ^{
  10. // 任务全部完成处理
  11. NSLog(@"isover");
  12. });

创建一个任务组,然后将异步操作放进组里面,在最后用notify 告知所有任务完成,并做相应处理,一般来说都是在主线程里面刷新UI来提示用户了。你如果不依赖UI放进子线程里面也是没有问题的。当然group同步的方式还有其他

[objc] view plain copy

  1. dispatch_async(dispatch_get_global_queue(0, 0), ^{
  2. for (int i = 0; i < 3; i ++)
  3. {
  4. dispatch_group_enter(group);
  5. // 任务代码i 假定任务 是异步执行block回调
  6. // block 回调执行
  7. dispatch_group_leave(group);
  8. // block 回调执行
  9. }
  10. });
  11. dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
  12. dispatch_async(dispatch_get_main_queue(), ^{
  13. // 主线程处理
  14. });

首先我们异步执行,因为dispatch_group_wait函数是阻塞的,for里面安排了三个任务,这三个任务都是加载,在任务开始前 调用 enter,任务完成时调用leave,wait函数一直阻塞,直到它发现group里面的任务全部leave,它才放弃阻塞(任务全部完成),然后我们在主线程更新UI告知用户.

时间: 2024-11-15 13:01:38

多线程并发流程控制之dispatch_group 有关函数的相关文章

JAVA之旅(二)——if,switch,for,while,do while,语句嵌套,流程控制break , continue ,函数,重载的示例总结

JAVA之旅(二)--if,switch,for,while,do while,语句嵌套,流程控制break , continue ,函数,重载的示例总结 JAVA的思想真的很重要,所以要专心的学--献给刚入门的小程序员们 一.语句 一般语句也就三个类型 判断语句 if 选择语句 switch 循环语句 for 当然,还有其他的 我们这里一个一个来讲 1.if if,如果,就是判断,if(条件){} //公共的 类 类名 public class HelloJJAVA { // 公共的 静态 无

Linux mysql shell脚本 变量和环境变量 位置参数 预定义变量 运算符 判断 流程控制 for循环 与用户交互 函数

mysql 1. 卸载旧版本 rpm -qa | grep mysql 检查是否有旧版本 查询结果:mysql-libs-5.1.73-7.el6.x86_64 rpm -e mysql-libs 删除旧版本 rpm -e --nodeps mysql-libs 强行删除 2. 安装mysql 2.1 安装源码需要编译 下载c的编译工具 yum -y install make gcc-c++ cmake bison-devel ncurses-devel 2.2 xftp连接上传 xftp连接上

Python流程控制常用工具和函数定义

在我们的工作中,我们使用ddagent ver.5作为收集工具,收集和报告托管服务器的性能指标,并对ddagent进行一定程度的定制.经过多次功能迭代,发现一批在线运行时间长的托管服务器占用了太多内存.分析问题机器上进程树中每个节点的占用情况,可以看出ddagent集合进程的内存占用仍然很高. 我们将学习最基本的流程控制工具,比如 if 条件判断 for 循环 while 循环 作为保证业务系统稳定运行的监控组件,存在内存泄漏,这自然是非常严重的,所以我们开始了我们的“故障排除之旅”. if-e

王家林亲传《DT大数据梦工厂》第二讲Scala函数定义、流程控制、异常处理入门

你想了解大数据,你想成为年薪百万吗?那你还等着什么,快点来吧!跟着王家林老师学习spark大数据 第二讲主要讲了Scala函数定义.流程控制.异常处理入门 函数定义: 关键字(def) 函数名称 参数(参数名称:参数类型):返回内容类型  =  { 函数体 } 注意: Unit:空的返回内容 Scala结束语是不需要写分号 下面一代码为例: //不带参数 Object  ScalaBasics{ def doWhile(){ var line = “” do{ line = readLine()

(13)mysql中的流程控制

概述 在mysql中可以使用if/case/loop/leave/iterate/repeat/while语句进行流程控制. if语句 if语句实现条件判断,类似高级语言(c/c++/php/java等)中的if语句. if search_condition then statement_list [elseif search_condition then statement_list]... [else statement_list] end if 举例 if mobile='13911113

四十二、视图、触发器、事务、储存过程、函数、流程控制和索引等知识的应用

一.视图 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么用视图 当反复用到两张表的连接操作时,可以将连成的表当做视图保存下来,下次直接使用 3.怎么用视图 create view teacher2course as select * from teacher inner join course on teacher.tid = course.teacher_id; 删除视图:drop view teacher2course 4.注意: 在硬盘中,视图只

mysql基础教程(四)-----事务、视图、存储过程和函数、流程控制

事务 概念 事务由单独单元的一个或多个SQL语句组成,在这 个单元中,每个MySQL语句是相互依赖的.而整个单独单 元作为一个不可分割的整体,如果单元中某条SQL语句一 旦执行失败或产生错误,整个单元将会回滚.所有受到影 响的数据将返回到事物开始以前的状态:如果单元中的所 有SQL语句均执行成功,则事物被顺利执行. 存储引擎 概念 在mysql中的数据用各种不同的技术存储 在文件(或内存)中. 查看 通过 show engines: 来查看mysql支持的存储引擎. 常见引擎 在mysql中用的

MySQL视图、触发器、事务、存储过程、内置函数、流程控制、索引

一.视图 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图 create view teacher2course as #把下面查询的结果放在视图teacher2course中 select * from teacher inner join course on teacher.tid = course.teacher_id; 注意: 1.视图只有表结构,视图中的数据还是来源于原来的表

MySQL-视图-触发器-事务-存储过程-函数-流程控制-索引与慢查询优化-06

目录 视图*** 什么是视图 为什么要用视图 如何生成视图 修改视图 --> 最好(千万)不要 关联表数据改动前 关联表数据改动之后 触发器 什么是触发器 触发条件 触发器语法结构 修改mysql的默认结束符(;) 触发器死循环 六个触发器的执行时机 新增前.新增后.删除前.删除后.更新前.更新后 NEW对象指代的就是当前记录(对象) 事务 ***** 什么是事务 事务的四大特性 ACID A:原子性 atomicity C:一致性 consistency I:隔离性 isolation D:持