GCD学习之dispatch_barrier_async
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的更多相关文章
- GCD学习(五) dispatch_barrier_async
先看段代码 dispatch_queue_t concurrentQueue = dispatch_queue_create("my.concurrent.queue", DISP ...
- GCD学习 —— 三
学习学习dispatch_block,在向队列中添加任务时,可以直接在对应的函数中添加 block.但是如果想对任务进行操作,比如监听任务.取消任务,就需要获取对应的 block. 1 创建Blo ...
- Swift - 3.0之GCD学习
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoa ...
- GCD中的dispatch_barrier_async函数的使用(栅栏函数)
<一>什么是dispatch_barrier_async函数 毫无疑问,dispatch_barrier_async函数的作用与barrier的意思相同,在进程管理中起到一个栅栏的作用,它 ...
- iOS多线程之GCD学习笔记
什么是GCD 1.全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 2.纯C语言,提供了非常多强大的函数 GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 G ...
- 2016 - 1 -17 GCD学习总结
一:GCD中的两个核心概念,队列与任务: 1.任务:执行什么操作.(代码块 block) 任务执行的类型分为以下两种: 1.1同步执行任务:在当前线程执行任务.不会开辟新的线程. 1.2异步执行任务: ...
- 多线程-GCD学习笔记
********************************* 基本概念 *********************************** 1. Grand Central Dispatch ...
- GCD学习
出自简书 : https://www.jianshu.com/p/2d57c72016c6 在 GCD 中有两种队列:串行队列和并发队列.两者都符合 FIFO(先进先出)的原则.两者的主要区别是:执行 ...
- GCD 学习(一)简介
文章摘抄至:http://zhuyanfeng.com/archives/3015 并有一些改动 GCD(Grand Central Dispatch)是从OS X Snow Leopard和iOS ...
随机推荐
- Shell 脚本学习资料搜集
Shell文档 ChinaUnix上大神“網中人”总结的Shell十三问,强烈推荐,这本书讲得比较精炼,而且都是一些Shell学习中容易把握不住的一些细节难点.每一问都写得非常精彩.ChinaUnix ...
- poj 4045 (树形DP)
先选一点为根节点找出所有父节点i到下面所有点距离和dp[i],该父节点下面有多少个点Node[i]. 然后求出所有节点的所有非子节点到该点的距离dp1[v]+=(dp1[u]+(dp[u]-dp[v] ...
- 消息队列数量统计(MSMQ,Performance Counter)
微软消息队列服务MSMQ (Microsoft Message Queue),工作在在线或者离线场景,并提供异步编程功能.互联网和企业开发很多场景应用,例如电商的订单处理流程,这是因为客户端不需要等待 ...
- ASP.NET中配置应用程序
1. 配置文件简介 1.1 分类 1.2关系 Machine.Config和Web.Config都是设置应用程序的配置信息,它们按照类似于继承的关系对应用程序起作用. Machine.Config ...
- ECSHOP在线手册布局参考图--商品详情页 goods.dwt
A.购物车 1,设置方法 程序自动读取购物车的商品数量 2,代码相关 cart.lbi 中 {insert_scripts files='transport.js'} <div clas ...
- Android大图片裁剪终极解决方案 原理分析
约几个月前,我正为公司的APP在Android手机上实现拍照截图而烦恼不已. 上网搜索,确实有不少的例子,大多都是抄来抄去,而且水平多半处于demo的样子,可以用来讲解知识点,但是一碰到实际项目,就漏 ...
- 根据Android架构分层推荐开发书籍
Android系统的架构可以分为六个部分.笔者根据自己的体会为大家推荐每个部分对应的精品书籍,不喜勿喷. 1.Android Application <Android Developer Do ...
- Libgdx Box2D真实---这缓释微丸(三:规则经常使用body和精灵联合)
介绍规则body怎样和图片结合.上一篇文章我介绍了box2D的基本知识,假设你用心的话.你会搜索网上相关简单demo吧.那些我就不写了.那么假设我用图片表示我的那个body.而不是简单线条.那该怎么办 ...
- Java,javascript,html,css的关系
内容:,就是制作者放在页面想让访问者浏览的内容 . 主要由java语言提供数据检索.更新.业务处理等. 结构:使内容更加具有逻辑性和易用性,类似于1,2级标题,正文.列表等等. HTML 表现:用于修 ...
- c++ 模运算
在数学里,"模运算"也叫"求余运算",用mod来表示模运算. 对于 a mod b 可以表示为 a = q(商)*b(模数) + r(余数),其中q表示商,b表 ...