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失效:

 - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSLog(@"main thread:%p",[NSThread currentThread]);
[self testBarrierBlockWithGlobalQueue];
}
- (void)testBarrierBlockWithGlobalQueue
{
NSLog(@"current iOS Version:%.1f",[[[UIDevice currentDevice] systemVersion] floatValue]);
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:];
NSLog(@"Excute block 1:%p",[NSThread currentThread]);
});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:];
NSLog(@"Excute block 2:%p",[NSThread currentThread]);
});
dispatch_barrier_async(queue, ^{
NSLog(@"Excute block 3:%p",[NSThread currentThread]);
[NSThread sleepForTimeInterval:];
});
dispatch_async(queue, ^{
NSLog(@"Excute block 4:%p",[NSThread currentThread]);
});
}
打印结果:
-- ::33.799 testGCD[:] main thread:0x7f87f8c0af70
-- ::33.800 testGCD[:] current iOS Version:8.3
-- ::33.800 testGCD[:] Excute block :0x7f87f8e14a60
-- ::33.800 testGCD[:] Excute block :0x7f87f8f222d0
-- ::35.802 testGCD[:] Excute block :0x7f87f8f27a90
-- ::36.804 testGCD[:] Excute block :0x7f87f8c1e610

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

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

 - (void)testBarrierBlockWithCreateQueue
{
NSLog(@"current iOS Version:%.1f",[[[UIDevice currentDevice] systemVersion] floatValue]);
dispatch_queue_t queue = dispatch_queue_create("com.testBarrierGCD", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:];
NSLog(@"Excute block 1:%p",[NSThread currentThread]);
});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:];
NSLog(@"Excute block 2:%p",[NSThread currentThread]);
});
dispatch_barrier_async(queue, ^{
NSLog(@"Excute block 3:%p",[NSThread currentThread]);
[NSThread sleepForTimeInterval:];
});
dispatch_async(queue, ^{
NSLog(@"Excute block 4:%p",[NSThread currentThread]);
});
}
打印结果:
-- ::55.671 testGCD[:] main thread:0x7fa51a428130
-- ::55.672 testGCD[:] current iOS Version:8.3
-- ::57.676 testGCD[:] Excute block :0x7fa51a65a890
-- ::58.673 testGCD[:] Excute block :0x7fa51a71cf50
-- ::58.674 testGCD[:] Excute block :0x7fa51a71cf50
-- ::02.676 testGCD[:] Excute block :0x7fa51a71cf50

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

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

GCD学习之dispatch_barrier_async的更多相关文章

  1. GCD学习(五) dispatch_barrier_async

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

  2. GCD学习 —— 三

    ​ 学习学习dispatch_block,在向队列中添加任务时,可以直接在对应的函数中添加 block.但是如果想对任务进行操作,比如监听任务.取消任务,就需要获取对应的 block. 1 创建Blo ...

  3. Swift - 3.0之GCD学习

    import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoa ...

  4. GCD中的dispatch_barrier_async函数的使用(栅栏函数)

    <一>什么是dispatch_barrier_async函数 毫无疑问,dispatch_barrier_async函数的作用与barrier的意思相同,在进程管理中起到一个栅栏的作用,它 ...

  5. iOS多线程之GCD学习笔记

    什么是GCD 1.全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 2.纯C语言,提供了非常多强大的函数 GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 G ...

  6. 2016 - 1 -17 GCD学习总结

    一:GCD中的两个核心概念,队列与任务: 1.任务:执行什么操作.(代码块 block) 任务执行的类型分为以下两种: 1.1同步执行任务:在当前线程执行任务.不会开辟新的线程. 1.2异步执行任务: ...

  7. 多线程-GCD学习笔记

    ********************************* 基本概念 *********************************** 1. Grand Central Dispatch ...

  8. GCD学习

    出自简书 : https://www.jianshu.com/p/2d57c72016c6 在 GCD 中有两种队列:串行队列和并发队列.两者都符合 FIFO(先进先出)的原则.两者的主要区别是:执行 ...

  9. GCD 学习(一)简介

    文章摘抄至:http://zhuyanfeng.com/archives/3015 并有一些改动 GCD(Grand Central Dispatch)是从OS X Snow Leopard和iOS ...

随机推荐

  1. 【Stage3D学习笔记续】真正的3D世界(四):空间大战雏形

    前面几个星期抽空用Starling做了一个打飞机的小游戏(所以没有接着看书了),准备面试时用的,结果面试还是没过%>_<%...这个游戏打算过几天全部开源了 那么接下来打算这周把<S ...

  2. ECSHOP在线手册布局参考图--通用活动页 group_list.dwt等

        A.购物车 1,设置方法 程序自动读取购物车的商品数量 2,代码相关 cart.lbi 中 {insert_scripts files='transport.js'} <div clas ...

  3. Windows Phone开发工具初体验【转载】

    Windows Phone开发工具在MIX 2010上火热登场了.Windows Mobile开发者们压抑许久的热情终于爆发出来,对于Windows Phone的华丽转身,开发者们褒贬不一,有人对Si ...

  4. ZOJ 3827 Information Entropy 水题

    Information Entropy Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/sh ...

  5. node.js在windows下的学习笔记(9)---文件I/O模块

    开发中我们经常会有文件I/O的需求,node.js中提供一个名为fs的模块来支持I/O操作,fs模块的文件I/O是对标准POSIX函数的简单封装. 1.将"hello world" ...

  6. android学习日记07--Canvas画布

    1.Canvas Canvas类主要实现了屏幕的绘制过程,其中包含了很多实用的方法,比如绘制一条路径.区域.贴图.画点.画线.渲染文本,当然Android官网提示大家很多方法有不同的重载版本,参数更灵 ...

  7. 浅谈Perl的类、包、模块与面对对象编程

    http://blog.chinaunix.net/uid-27464093-id-3308003.html Perl面向对象 Perl面向对象学习例子实例代码教程 - 在我们了解perl的面向对象的 ...

  8. C#_wpf_userinput_数据绑定_后台对象改变,界面数据也变化

    <!--MainWindow.xaml--> <Window x:Class="UserStore.MainWindow" xmlns="http:// ...

  9. java_泛型(设置通配符下限)

    package ming; import java.util.ArrayList; import java.util.Collection; import java.util.List; /* * 返 ...

  10. [COCOS2DX]交叉编译实践+速度优化(vs2012修改win32代码+修改makefile+编译安卓项目包+部署安卓项目包到Eclipse+运行apk)

    通过前面的部署过程可以知道cocos2dx的开发过程如下: 1.VS2012完成修改 2.因为指定了CPP文件位置,ndk可以通过jni方式完成C++文件的编译,运行以下命令完成proj.androi ...