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 ...
随机推荐
- DOS/Windows下黑客攻防(一)——神秘黑客大曝光
一.认识神秘的黑客 谈到网络安全,人们不自觉间就会联想到黑客,人们往往会将他们同破坏网络安全.盗取用户账号.偷窃个人私密信息联系起来.其实黑客也有好坏之分,他们并不全是网络上的捣乱分子,其中也有一部分 ...
- PowerDesigner实用技巧小结(3)
PowerDesigner实用技巧小结(3) PowerDesigner 技巧小结 sqlserver数据库databasevbscriptsqldomain 1.PowerDesigner 使用 M ...
- ABAP DEBUG
[Function] Command=/H Type=SystemCommand 将上面的文件推动到SAP 窗口 可以启动调试 ------------------------------------ ...
- 注入限制绕过<转>
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“'”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以 ...
- iOS 关闭自动锁屏
[UIApplication sharedApplication].idleTimerDisabled=YES;// 不自动锁屏 [UIApplication sharedApplication].i ...
- Codeforces Codeforces Round #319 (Div. 2) A. Multiplication Table 水题
A. Multiplication Table Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/57 ...
- 获取windows版本信息
procedure TForm1.Button1Click(Sender: TObject); Var OSVI:OSVERSIONINFO; begin OSVI.dwOSversi ...
- mysql中删除表
有两种方式: 1.delete from table table_name; 2.truncate table table_name; 第一种中,清空表后,主键id会在原先的记录基础上继续增加,而第二 ...
- 了解undefined、null、NaN的区别
1.常规的解释,null是个对象,表示空值,undefined也是个对象,表示没有定义 2.详细分析 null 书上的解释(Javascript权威指南),Javascript的关键词null是一种特 ...
- [013]函数重载--int*和void*的匹配优先级
同事去面试的时候的问题: 测试一下发现:在同时存在int*和void*的重载函数时,vs2010的环境下,优先匹配void* #include<iostream> using namesp ...