iOS常见的多线程开发方式有NSThread、NSOPeration和GCD,抽象程度依次提高,GCD是最抽象的,使用起来最简单,但相对来说功能有限,比如不能cancel任务,这也算是一点遗憾吧。

今天主要记录下学习dispatch_barrier_async中遇到的问题(其实是自己没仔细看Apple文档),dispatch_barrier_async是在执行完前面的任务后它才执行,而且它后面的任务等它执行完成之后才会执行(先后顺序是按照添加到queue的次序),但该API适用的场景是dispatch queue必须是用DISPATCH_QUEUE_CONCURRENT属性创建的queue,而不能是用系统定义好的dispatch_get_global_queue,下面是测试代码:

1、当dispatch queue是dispatch_get_global_queue时,dispatch_barrier_async失效:

 1 - (void)viewDidLoad {
 2     [super viewDidLoad];
 3     // Do any additional setup after loading the view, typically from a nib.
 4     NSLog(@"main thread:%p",[NSThread currentThread]);
 5     [self testBarrierBlockWithGlobalQueue];
 6 }
 7 - (void)testBarrierBlockWithGlobalQueue
 8 {
 9     NSLog(@"current iOS Version:%.1f",[[[UIDevice currentDevice] systemVersion] floatValue]);
10     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
11     dispatch_async(queue, ^{
12         [NSThread sleepForTimeInterval:2];
13         NSLog(@"Excute block 1:%p",[NSThread currentThread]);
14     });
15     dispatch_async(queue, ^{
16         [NSThread sleepForTimeInterval:3];
17         NSLog(@"Excute block 2:%p",[NSThread currentThread]);
18     });
19     dispatch_barrier_async(queue, ^{
20         NSLog(@"Excute block 3:%p",[NSThread currentThread]);
21         [NSThread sleepForTimeInterval:4];
22     });
23     dispatch_async(queue, ^{
24         NSLog(@"Excute block 4:%p",[NSThread currentThread]);
25     });
26 }
27 打印结果:
28 2015-06-09 23:16:33.799 testGCD[46920:3369866] main thread:0x7f87f8c0af70
29 2015-06-09 23:16:33.800 testGCD[46920:3369866] current iOS Version:8.3
30 2015-06-09 23:16:33.800 testGCD[46920:3370037] Excute block 4:0x7f87f8e14a60
31 2015-06-09 23:16:33.800 testGCD[46920:3370029] Excute block 3:0x7f87f8f222d0
32 2015-06-09 23:16:35.802 testGCD[46920:3370027] Excute block 1:0x7f87f8f27a90
33 2015-06-09 23:16:36.804 testGCD[46920:3370026] Excute block 2:0x7f87f8c1e610

从打印结果可以看到不是预想的block3在block1、block2后面,最后再执行block4,说明在global_queue下dispatch_barrier_async失效。

2、当dispatch queue是用DISPATCH_QUEUE_CONCURRENT属性创建的queue时,dispatch_barrier_async有效:

 1 - (void)testBarrierBlockWithCreateQueue
 2 {
 3     NSLog(@"current iOS Version:%.1f",[[[UIDevice currentDevice] systemVersion] floatValue]);
 4     dispatch_queue_t queue = dispatch_queue_create("com.testBarrierGCD", DISPATCH_QUEUE_CONCURRENT);
 5     dispatch_async(queue, ^{
 6         [NSThread sleepForTimeInterval:2];
 7         NSLog(@"Excute block 1:%p",[NSThread currentThread]);
 8     });
 9     dispatch_async(queue, ^{
10         [NSThread sleepForTimeInterval:3];
11         NSLog(@"Excute block 2:%p",[NSThread currentThread]);
12     });
13     dispatch_barrier_async(queue, ^{
14         NSLog(@"Excute block 3:%p",[NSThread currentThread]);
15         [NSThread sleepForTimeInterval:4];
16     });
17     dispatch_async(queue, ^{
18         NSLog(@"Excute block 4:%p",[NSThread currentThread]);
19     });
20 }
21 打印结果:
22 2015-06-09 23:21:55.671 testGCD[46963:3373180] main thread:0x7fa51a428130
23 2015-06-09 23:21:55.672 testGCD[46963:3373180] current iOS Version:8.3
24 2015-06-09 23:21:57.676 testGCD[46963:3373293] Excute block 1:0x7fa51a65a890
25 2015-06-09 23:21:58.673 testGCD[46963:3373294] Excute block 2:0x7fa51a71cf50
26 2015-06-09 23:21:58.674 testGCD[46963:3373294] Excute block 3:0x7fa51a71cf50
27 2015-06-09 23:22:02.676 testGCD[46963:3373294] Excute block 4:0x7fa51a71cf50

从打印结果可以看出block执行顺序是按照我们预期的顺序在执行,至此说明了dispatch_barrier_async适用的场景是dispatch queue必须是用DISPATCH_QUEUE_CONCURRENT属性创建的queue(其实Apple文档中有说明的,以后用新的API时一定得仔细阅读文档,避免多走弯路)~祝大家玩的愉快~

测试代码已上传至GitHub:https://github.com/iOSGeek0829/testGCDWithBarrierBlock

转载于:https://www.cnblogs.com/NerdFooProgrammer/p/4564961.html

GCD学习之dispatch_barrier_async相关推荐

  1. GCD学习(五) dispatch_barrier_async

    先看段代码 dispatch_queue_t concurrentQueue = dispatch_queue_create("my.concurrent.queue", DISP ...

  2. GCD学习之简单小结

    1.常用的方法dispatch_async 为了避免界面在处理耗时的操作时卡死,比如读取网络数据,IO,数据库读写等,我们会在另外一个线程中处理这些操作,然后通知主线程更新界面. 用GCD实现这个流程 ...

  3. stein法求gcd 学习笔记

    原理显然 由于当x,y都为奇数时进行辗转相见 每次减完必有偶数 而偶数最多除log次 那么也最多减log次 复杂度有保证 注:代码未验证 int gcd(int x,int y){int res=1; ...

  4. IOS开发之多线程 -- GCD的方方面面

    前言:这篇GCD的博文是本人阅读了很多海内外大神的关于GCD的文章,以及结合之前自己对GCD的粗浅的认识,然后取其精华,去其槽粕,综合起来的笔记,而且是尽可能的以通熟易懂的并且是正确的理论论述方式呈现 ...

  5. iOS开发系列--并行开发其实很容易

    --多线程开发 概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的, ...

  6. IOS多线程开发详解

    概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操 ...

  7. swift ~ 2020年 swift面试题

     联系人:石虎 QQ:1224614774  昵称: 嗡嘛呢叭咪哄                       QQ群:807236138  群称: iOS 技术交流学习群               ...

  8. iOS 开发中的多线程

    线程.进程 什么是线程.进程   有的人说进程就像是人的脑袋,线程就是脑袋上的头发~~.其实这么比方不算错,但是更简单的来说,用迅雷下载文件,迅雷这个程序就是一个进程,下载的文件就是一个线程,同时下载 ...

  9. 常用的几个提高iOS开发效率的开源类库及工具

    转自 iOS开发者 : 几个常用的开源类库及下载地址: 算上这个连接:http://wenku.baidu.com/view/bbeb0091dd88d0d233d46a00.html 1.json  ...

最新文章

  1. mac mysql 5.7.9安装教程_mac系统OS X10.10版本安装最新5.7.9mysql的方法_MySQL
  2. RSS - 简单方便的follow资讯
  3. python手机端编程环境_Python + Appium 环境搭建
  4. Java Web学习总结(34)——拦截器和过滤器的差异总结
  5. python网页部署-想用python3做web开发的一些不知(主要是环境部署),求解!
  6. 扫地机器人单扫和双扫_评测 | 千元以下的扫拖一体机器人,到底值不值得买?...
  7. 语言 OJ 高低位逆转_用于检测污水井内水位高低的报警器--液位开关
  8. ElasticSearch 2 (20) - 语言处理系列之如何开始
  9. 【算法学习】【图像增强】【Retinex】Retinex Image Processing(NASA)
  10. 百度普通收录正式下线,大量草根站长收录难
  11. (综述,讲得很好)基于3DMM的三维人脸重建技术总结
  12. 梯度下降与支持向量机
  13. 轻量快速的国产导航软件Flare
  14. 你不知道的3D电影7大危害
  15. vue+websocket+express+mongodb实战项目(实时聊天)(一)
  16. 计算机怎么查找表格里内容,请教如何迅速查找复杂EXCEL表格里的内容? -电脑资料...
  17. 冰雪第一天历险 - 2014 年的冬天第一场站得住的雪?
  18. eclipse 无法启动
  19. Java中多线程、多线程的实现方式、同步代码块的方式
  20. MySQL查询增强--多子句查询

热门文章

  1. 解决maltab的中文和英文字体问题,中文乱码
  2. 第十一周项目实践4 BFS(广度优先搜索)基本模板
  3. medianBlur函数
  4. java实现类似于while(cin n)的操作
  5. C. Three Parts of the Array(切割字符串)
  6. 回溯法(深度优先搜索)
  7. c++对那些类型的数据不能使用引用_基于js数据类型浅谈deepClone
  8. 信号与系统参考书推荐
  9. PCB 内网实现《OCR文字识别》实现逻辑
  10. 并发队列-无界非阻塞队列 ConcurrentLinkedQueue 原理探究