iOS之《Effective Objective-C 2.0》读书笔记(46)
来源:互联网 发布:centos命令 desktop 编辑:程序博客网 时间:2024/06/05 16:21
第46条:不要使用dispatch_get_current_queue
1.有两个串行派发队列:
- 到最内层的派发队列时,会死锁。A在等B,B在等A,A阻塞
-(void)demo1{ dispatch_queue_t queueA = dispatch_queue_create("com.lyk.queueA", NULL); dispatch_queue_t queueB = dispatch_queue_create("com.lyk.queueB", NULL); dispatch_sync(queueA, ^{ dispatch_sync(queueB, ^{ dispatch_sync(queueA, ^{ //...... }); }); }); }
2.用dispatch_get_current_queue来检测:
- 这样做依然死锁,dispatch_get_current_queue获取到的当前队列是queueB,所以结果依然执行针对queueA的同步派发操作
-(void)demo2{ dispatch_queue_t queueA = dispatch_queue_create("com.lyk.queueA", NULL); dispatch_queue_t queueB = dispatch_queue_create("com.lyk.queueB", NULL); dispatch_sync(queueA, ^{ dispatch_sync(queueB, ^{ dispatch_block_t block = ^{}; if (dispatch_get_current_queue() == queueA) { block(); } else { dispatch_sync(queueA, block); } }); }); }
3.通过GCD所提供的功能来设定“队列特有数据“:
- 可以把任意数据以键值对形式关联到队列中。如果根据指定的键获取不到关联数据,系统会沿着层级体系向上查找,直到找到数据或达到跟队列为止
-(void)demo3{ dispatch_queue_t queueA = dispatch_queue_create("com.lyk.queueA", NULL); dispatch_queue_t queueB = dispatch_queue_create("com.lyk.queueB", NULL); dispatch_set_target_queue(queueB, queueA); static int kQueueSpecific; CFStringRef queueSpecificValue = CFSTR("queueA"); dispatch_queue_set_specific(queueA, &kQueueSpecific, (voidvoid *)queueSpecificValue, (dispatch_function_t)CFRelease); dispatch_sync(queueB, ^{ dispatch_block_t block = ^{ NSLog(@"NO deadlock!"); }; CFStringRef retrievedValue = dispatch_get_specific(&kQueueSpecific); if (retrievedValue) { block(); } else { dispatch_sync(queueA, block); } }); }
阅读全文
0 0
- iOS之《Effective Objective-C 2.0》读书笔记(46)
- <iOS读书笔记>之Effective Objective-C 2.0
- iOS之《Effective Objective-C 2.0》读书笔记(1)
- iOS之《Effective Objective-C 2.0》读书笔记(2)
- iOS之《Effective Objective-C 2.0》读书笔记(3)
- iOS之《Effective Objective-C 2.0》读书笔记(4)
- iOS之《Effective Objective-C 2.0》读书笔记(5)
- iOS之《Effective Objective-C 2.0》读书笔记(6)
- iOS之《Effective Objective-C 2.0》读书笔记(7)
- iOS之《Effective Objective-C 2.0》读书笔记(8)
- iOS之《Effective Objective-C 2.0》读书笔记(9)
- iOS之《Effective Objective-C 2.0》读书笔记(10)
- iOS之《Effective Objective-C 2.0》读书笔记(11)
- iOS之《Effective Objective-C 2.0》读书笔记(12)
- iOS之《Effective Objective-C 2.0》读书笔记(13)
- iOS之《Effective Objective-C 2.0》读书笔记(14)
- iOS之《Effective Objective-C 2.0》读书笔记(16)
- iOS之《Effective Objective-C 2.0》读书笔记(17)
- 安装centos后无法引导启动windows7的解决方法
- XML中的转义方法
- 数据查询语言DQL,数据操纵语言DML, 数据定义语言DDL,数据控制语言DCL
- 前端笔记之清空canvas
- 04-05 mysql的学习笔记
- iOS之《Effective Objective-C 2.0》读书笔记(46)
- View的工作原理
- 实习日记(第一周)
- Java二进制操作(动力节点Java学院整理)
- 信息量, 信息熵, 交叉熵, KL散度
- OpenStreetMap地图服务器安装
- Android中的复制粘贴
- 密码学之散列
- CentOS7 Tomcat JSP 安装部署