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 ...
随机推荐
- [iOS基础控件 - 1] UI概念
A. UIView 1.概念 属于UIKit框架 屏幕上能看得见摸得着的东西就是UIView,比如屏幕上的按钮.文字.图片 翻译为:视图/控件/组件 UIBut ...
- [Objective-c 基础 - 3.4] protocol
A.概念 1.用来声明方法(不能声明成员变量) 2.只要某个类遵守了这个协议,相当于拥有了协议中得所有方法的声明 3.属性 (1)@required:默认,要求实现,不实现就会发出警告 (2)@opt ...
- 实现windows和linux互传文件
http://www.cnblogs.com/ylan2009/archive/2012/01/12/2321126.html 尝试从windows xp向ubuntu11.10传文件 ubuntu使 ...
- .Net Core-TagHelpers-Environment
当我们新建一个.net core项目时,发现页面中有个奇怪的TagHelper元素,如下: <environment names="Development"> ...
- Asp.net 用 Graphics 统计图(柱状图, 折线图, 扇形图)
统计图形种类繁多, 有柱状图, 折线图, 扇形图等等, 而统计图形的绘制方法也有很多, 有Flash制作的统计图形, 有水晶报表生成统计图形, 有专门制图软件制作, 也有编程语言自己制作的:这里我们用 ...
- samba 问题Windows能看到文件夹但是不能打开
问题同上,查看防火墙等等各种方法都试过了没能解决,最后问题太弱智了. 设置共享的目录在root下,root是神圣不可侵犯的,怎么能在这个下面呢
- Android 如何修改默认的searchable items。
前言 欢迎大家我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net ...
- [MODx] 9. Real Example
Snippet code: <?php $path = MODX_CORE_PATH . 'components/storefinder/'; $result = $modx->addPa ...
- [017]string类使用注意事项
最近自己写着玩,写了一个这样的函数: void foo(const string& iStr) { ; i < iStr.length(); ++i) { string str = iS ...
- git svn 5点区别
如果你在读这篇文章,说明你跟大多数开发者一样对GIT感兴趣,如果你还没有机会来试一试GIT,我想现在你就要了解它了. GIT不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等.如果 ...