一、简介

dispatch_group_enter:通知group,下面的任务马上要放到group中执行了。

dispatch_group_leave:通知group,任务完成了,该任务要从group中移除了。

这两种通知可以在多线程间自由穿梭的。

二、验证

下面用代码验证下它们的作用。

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    [self syncAction];
} - (void)syncAction{ dispatch_group_t group =dispatch_group_create();
dispatch_queue_t globalQueue=dispatch_get_global_queue(, ); dispatch_group_enter(group); //模拟多线程耗时操作
dispatch_group_async(group, globalQueue, ^{
sleep();
NSLog(@"%@---block1结束。。。",[NSThread currentThread]);
dispatch_group_leave(group);
});
NSLog(@"%@---1结束。。。",[NSThread currentThread]); dispatch_group_enter(group);
//模拟多线程耗时操作
dispatch_group_async(group, globalQueue, ^{
sleep();
NSLog(@"%@---block2结束。。。",[NSThread currentThread]);
dispatch_group_leave(group);
});
NSLog(@"%@---2结束。。。",[NSThread currentThread]); dispatch_group_notify(group, dispatch_get_global_queue(, ), ^{
NSLog(@"%@---全部结束。。。",[NSThread currentThread]);
}); }

运行app,点击页面打印的结果如下:

-- ::27.853 CPMNetworking[:] <NSThread: 0x600000068600>{number = , name = main}---1结束。。。
-- ::27.856 CPMNetworking[:] <NSThread: 0x600000068600>{number = , name = main}---2结束。。。
-- ::30.923 CPMNetworking[:] <NSThread: 0x608000263f00>{number = , name = (null)}---block1结束。。。
-- ::30.930 CPMNetworking[:] <NSThread: 0x6000002647c0>{number = , name = (null)}---block2结束。。。
-- ::30.930 CPMNetworking[:] <NSThread: 0x6000002647c0>{number = , name = (null)}---全部结束。。。

结论:

在开启了多线程执行任务时,若使用了dispatch_group_notify、dispatch_group_enter、dispatch_group_leave,也能有效的保证了等所有的子线程任务处理完后,有一个处理最后结果的地方。

GCD使用dispatch_group_notify、dispatch_group_enter、dispatch_group_leave处理多线程同步操作的更多相关文章

  1. NSThread 子线程 Cocoa NSOperation GCD(Grand Central Dispatch) 多线程

    单词:thread 英 θred:n 线.思路.vt 穿过.vi 穿透过 一.    进程.线程 进程:正在进行中的程序被称为进程,负责程序运行的内存分配,每一个进程都有自己独立的虚拟内存空间 线程: ...

  2. 20 (OC)* GCD、NSOperation、NSThread。多线程

    多线程编程技术的优缺点比较 NSThread (抽象层次:低) 优点:轻量级,简单易用,可以直接操作线程对象 缺点: 需要自己管理线程的生命周期,线程同步.线程同步对数据的加锁会有一定的系统开销. C ...

  3. iOS 多线程 GCD part3:API

    https://www.jianshu.com/p/072111f5889d 2017.03.05 22:54* 字数 1667 阅读 88评论 0喜欢 1 0. 预备知识 GCD对时间的描述有些新奇 ...

  4. iOS开发之多线程(NSThread、NSOperation、GCD)

    整理一些多线程相关的知识. 并行 & 并发 1.并行:并行是相对于多核而言的,几个任务同时执行.2.并发:并发是相对于单核而言的,几个任务之间快速切换运行,看起来像是"同时" ...

  5. ios开发多线程--GCD

    引言 虽然GCD使用很广,而且在面试时也经常问与GCD相关的问题,但是我相信深入理解关于GCD知识的人肯定不多,大部分都是人云亦云,只是使用过GCD完成一些很简单的功能.当然,使用GCD完成一些简单的 ...

  6. iOS开发——GCD多线程详解

    GCD多线程详解 1. 什么是GCD Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,简单来说,GCD就是iOS一套解决多线程的机制,使用GCD能够最大限度简化多线程 ...

  7. UI:多线程 、用GCD创建线程

    什么是应用(程序):就是我们编写的代码编译后生成的app文件 进程:凡是一个运行的程序都可以看作为一个进程,如打开的多个 word,就可以认为是一个进程的多个线程. 线程:至少有一个线程就是主线程,网 ...

  8. iOS 多线程 浅述

    什么是进程? 进程是指在系统中正在运行的一个应用程序. 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 什么是线程? 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程 ...

  9. iOS - Threads 多线程

    1.Threads 1.1 进程 进程是指在系统中正在运行的一个应用程序.每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 比如同时打开 QQ.Xcode,系统就会分别启动两个进程. ...

随机推荐

  1. centos 下添加epel源

    来源于http://www.centoscn.com/CentOS/config/2014/0920/3793.html,收录备用 0.安装yum优先级插件 yum install yum-prior ...

  2. temp--test audio micphone

    DWORD CALLBACK waveInProc(HWAVEIN hWaveIn, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwPara ...

  3. nginx解析php请求为404

    刚搭建了lnmp环境,发现如果讲我的程序放在某个文件夹的时候,然后nginx进行代理的时候竟然会是404: nginx配置如下: # pass the PHP scripts to FastCGI s ...

  4. 让阿里云支持ipv6(其他多数VPS通用)

    https://www.tunnelbroker.net/tunnel_detail.php?tid=322922

  5. iOS10适配及Xcode8配置

    一.证书管理 用Xcode8打开工程后,比较明显的就是下图了,这个是苹果的新特性,可以帮助我们自动管理证书.建议大家勾选这个Automatically manage signing(Ps.但是在bea ...

  6. c#开发Mongo笔记第二篇

    写到第二篇不得不说是我之前犯了一个小错误,其实实现子表存储也是很简单的事,先说我想实现什么样的效果吧 就是用户表里有个成绩字段,成绩字段是个子表 其实实现这个功能也很简单,用面向对象的思想很好理解,子 ...

  7. acm入门编成题

    http://wenku.baidu.com/view/c8f2f64acf84b9d528ea7aee.html

  8. 对csv文件的操作

    统计行数 wc -l /home/hadoop/workspace/ChemicalFactory/input/device101.csv 输出前两行数据 head -n 2 /home/hadoop ...

  9. (2016春) 作业1:博客和Github简单练习

    0. 博客和Github简单练习 总分:10分 1. 目的 博客使用:注册.发布博客.博客管理练习 Github使用:注册.文件同步等练习 2. 要求 (总体作业要求参考[链接]) 发布一篇博客: 介 ...

  10. 安卓奇葩问题之:设置webView超时

    我只想说:what a fucking day! 今天要做一个webView的超时功能,于是开始百度,一看貌似很简单啊,于是开始copy了下面的代码. import java.util.Timer; ...