dispatch_barrier_async 隐藏的坑
2015-12-11 15:10
405 查看
今天在看文档的时候无意中发现的一个坑
* When submitted to a a global queue or to a queue not created with the
* DISPATCH_QUEUE_CONCURRENT attribute, barrier blocks behave identically to
* blocks submitted with the dispatch_async()/dispatch_sync() API.
本来以为DISPATCH_QUEUE_CONCURRENT的queue都没有问题,但是看到最后发现global queue也不起作用。
关于global queue :
@function dispatch_get_global_queue
*
* @abstract
* Returns a well-known global concurrent queue of a given quality of service
* class.
开来barrier只支持使用dispatch_queue_create创建出来的并行queue了。
做个测试:
#define LOG(...) {NSLog(@"begin"); \
__VA_ARGS__ \
NSLog(@"end");}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
LOG(dispatch_queue_t queue =
dispatch_queue_create("connect queue",
DISPATCH_QUEUE_CONCURRENT);
//dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
sleep(2.f);
NSLog(@"one");
});
dispatch_barrier_async(queue, ^{
NSLog(@"barrier");
});
dispatch_async(queue, ^{
NSLog(@"two");
});)
return
YES;
}
LOG输出:
2015-12-11 14:56:14.538 iOSTips[1961:115128] begin
2015-12-11 14:56:14.539 iOSTips[1961:115128] end
2015-12-11 14:56:16.544 iOSTips[1961:115327] one
2015-12-11 14:56:16.545 iOSTips[1961:115327] barrier
2015-12-11 14:56:16.545 iOSTips[1961:115327] two
barrier在这个时候是起作用的。再来看看global queue
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
LOG(dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0);
dispatch_async(queue, ^{
sleep(2.f);
NSLog(@"one");
});
dispatch_barrier_async(queue, ^{
NSLog(@"barrier");
});
dispatch_async(queue, ^{
NSLog(@"two");
});)
return
YES;
LOG输出:
2015-12-11 15:04:49.094 iOSTips[2068:122004] begin
2015-12-11 15:04:49.095 iOSTips[2068:122004] end
2015-12-11 15:04:49.095 iOSTips[2068:122120] barrier
2015-12-11 15:04:49.095 iOSTips[2068:122099] two
2015-12-11 15:04:51.095 iOSTips[2068:122210] one
仔细看LOG输出啊,以后别采坑啦~~
* When submitted to a a global queue or to a queue not created with the
* DISPATCH_QUEUE_CONCURRENT attribute, barrier blocks behave identically to
* blocks submitted with the dispatch_async()/dispatch_sync() API.
本来以为DISPATCH_QUEUE_CONCURRENT的queue都没有问题,但是看到最后发现global queue也不起作用。
关于global queue :
@function dispatch_get_global_queue
*
* @abstract
* Returns a well-known global concurrent queue of a given quality of service
* class.
开来barrier只支持使用dispatch_queue_create创建出来的并行queue了。
做个测试:
#define LOG(...) {NSLog(@"begin"); \
__VA_ARGS__ \
NSLog(@"end");}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
LOG(dispatch_queue_t queue =
dispatch_queue_create("connect queue",
DISPATCH_QUEUE_CONCURRENT);
//dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
sleep(2.f);
NSLog(@"one");
});
dispatch_barrier_async(queue, ^{
NSLog(@"barrier");
});
dispatch_async(queue, ^{
NSLog(@"two");
});)
return
YES;
}
LOG输出:
2015-12-11 14:56:14.538 iOSTips[1961:115128] begin
2015-12-11 14:56:14.539 iOSTips[1961:115128] end
2015-12-11 14:56:16.544 iOSTips[1961:115327] one
2015-12-11 14:56:16.545 iOSTips[1961:115327] barrier
2015-12-11 14:56:16.545 iOSTips[1961:115327] two
barrier在这个时候是起作用的。再来看看global queue
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
LOG(dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0);
dispatch_async(queue, ^{
sleep(2.f);
NSLog(@"one");
});
dispatch_barrier_async(queue, ^{
NSLog(@"barrier");
});
dispatch_async(queue, ^{
NSLog(@"two");
});)
return
YES;
LOG输出:
2015-12-11 15:04:49.094 iOSTips[2068:122004] begin
2015-12-11 15:04:49.095 iOSTips[2068:122004] end
2015-12-11 15:04:49.095 iOSTips[2068:122120] barrier
2015-12-11 15:04:49.095 iOSTips[2068:122099] two
2015-12-11 15:04:51.095 iOSTips[2068:122210] one
仔细看LOG输出啊,以后别采坑啦~~
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 讲解iOS开发中基本的定位功能实现
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- 浅析iOS应用开发中线程间的通信与线程安全问题
- 检测iOS设备是否越狱的方法
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- IOS 改变键盘颜色代码
- 举例详解iOS开发过程中的沙盒机制与文件
- Android和IOS的浏览器中检测是否安装某个客户端的方法
- 分享一个iOS下实现基本绘画板功能的简单方法
- javascript实现阻止iOS APP中的链接打开Safari浏览器